Javascript 如何创建不带“的类的实例”;新";关键词
此项目是带有TypeScript的NodeJS项目 我想创建App类的实例。但是,如果我使用Javascript 如何创建不带“的类的实例”;新";关键词,javascript,node.js,typescript,ecmascript-6,Javascript,Node.js,Typescript,Ecmascript 6,此项目是带有TypeScript的NodeJS项目 我想创建App类的实例。但是,如果我使用new关键字,我必须传递构造函数参数 问题是构造函数参数应该与依赖项注入一起传递。因此,我不能使用new关键字来创建实例 // Express import { application as app } from 'express'; // Controllers import { UserController } from './controllers/user.controller' export
new
关键字,我必须传递构造函数参数
问题是构造函数参数应该与依赖项注入一起传递。因此,我不能使用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'
//Express
从“express”导入{application as app};
//控制器
从“./controllers/user.controller”导入{UserController}
导出类应用程序{
构造函数(userController:userController){
console.log(“应用程序正在运行”);
log(“UserController url路径为:”,UserController.getUrlPath);
这个。run();
}
run():void{
应用程序侦听(3000,函数(){
log('应用程序正在端口3000上运行!');
});
}
check():void{
控制台日志(“工作良好”);
}
}
const-appInstance:App=Object.create(App.prototype);//这不是创造
console.log(appInstance.check());//=>'未定义的'
这似乎与使用类的概念背道而驰如果出于测试目的需要避免传递具体的
UserController
,可以使用某种形式的mock。另一种选择是使用
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\u USER\u CONTROLLER\u FROM\u DI
这似乎与使用类的概念背道而驰如果出于测试目的需要避免传递具体的
UserController
,可以使用某种形式的mock。另一种选择是使用
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\u USER\u CONTROLLER\u FROM\u DI
您想在不调用构造函数的情况下实例化它吗?这对我来说似乎很奇怪。您不能先实例化userController,然后在构建应用程序类时将其传递进来吗?@JustusRomijn问题iUserController的构造函数有一些参数。参数的构造函数有参数。因此,它就像:新应用程序(新UserController(新UserRepository(新BaseRepository(新Blablabla)))这些参数应该随依赖项注入一起提供(自动)。但我无法创建此应用程序类。忽略new
不是您的解决方案。在使用依赖项注入时,您仍然必须首先使用“new”创建这些依赖项。或者您可以使用单独的类来管理您的依赖项。您想在不调用构造函数的情况下实例化它吗?这对我来说似乎很奇怪。您不能实例化吗首先触发UserController,并在构造应用程序类时将其传入?@JustusRomijn问题是UserController的构造函数有一些参数。而参数的构造函数有参数。因此,它就像:new App(new UserController(new UserRepository(new BaseRepository(new BlaBla)))参数应该随依赖项注入一起提供(自动)。但我无法创建此应用程序类。忽略new
不是您的解决方案。使用依赖项注入时,您仍然必须先使用“new”创建这些依赖项。或者,您可以使用单独的类来管理依赖项。