如何在没有“新”关键字的情况下创建类的实例

时间:2019-06-08 14:29:27

标签: javascript node.js typescript ecmascript-6

该项目是带有TypeScript的NodeJS项目。

我想创建一个App类的实例。但是,如果我使用new关键字,则必须传递构造函数参数。

问题在于构造函数参数应该与依赖项注入一起传递。因此,我无法使用// Express import { application as app } from 'express'; // Controllers import { UserController } from './controllers/user.controller' export class App { constructor(userController: UserController) { console.log("App is running"); console.log("UserController url path is : ", userController.getUrlPath); this.run(); } run(): void { app.listen(3000, function () { console.log('App is running on port 3000!'); }); } check(): void { console.log("working well"); } } const appInstance: App = <App>Object.create(App.prototype); // it is not creating console.log( appInstance.check() ); // ==> 'undefined' 关键字来创建实例。

{{1}}

1 个答案:

答案 0 :(得分:0)

这似乎与使用类的概念相反
如果您需要避免通过具体的UserController进行测试,则可以使用某种形式的模拟。
另一种选择是使用类型any的变量:

const app = new App({} as any);

取决于您的tsconfig.json配置,它应该可以工作(显然,您将无法访问UserController对象的任何功能/字段,但可以访问App的构造应该可以正常工作。
最后一个选项(至少可以想到)是为UserController使用setter函数:

export class App {
 private _userController: UserController;
 get userController(): UserController {
  return this._userController;
 }
 set userController(ctrl: UserController) {
  this._userController = ctrl;
 }
}

这样,在建立完整的DI基础结构之后,您可以使用App.userController = SOME_USER_CONTROLLER_FROM_DI

相关问题