Node.js 如何在typescript中扩展类
我的服务是用nodejs设计的。 下面是我的情景 我有两个控制器,一个将扩展另一个。两个控制器中都有一个静态函数,其中静态变量将被赋值。 根据数据的条件,我尝试调用相应的控制器,以便静态变量获得适当的赋值 注意: 下面的代码只是解释场景的一个片段,而不是应用程序的实际代码。但此代码段的顺序/调用/控制器结构完全相同。此外,listOfDept变量在firstController和secondController的checkStart函数中将具有单独的业务逻辑Node.js 如何在typescript中扩展类,node.js,typescript,oop,implements,Node.js,Typescript,Oop,Implements,我的服务是用nodejs设计的。 下面是我的情景 我有两个控制器,一个将扩展另一个。两个控制器中都有一个静态函数,其中静态变量将被赋值。 根据数据的条件,我尝试调用相应的控制器,以便静态变量获得适当的赋值 注意: 下面的代码只是解释场景的一个片段,而不是应用程序的实际代码。但此代码段的顺序/调用/控制器结构完全相同。此外,listOfDept变量在firstController和secondController的checkStart函数中将具有单独的业务逻辑 // firstController
// firstController.ts
firstController implements IFirstController {
private static listOfDept: string[];
static checkStart(){
firstController.listOfDept = // my logic to fill this object
}
constructor (){}
}
getRelevantData(next: (error: string, response: any) => void): void {
var myObject = firstController.listOfDept;
this.myRepository.uniqueData(myObject, next);
}
}
firstController.checkStart();
export = firstController;
//ifirstController.ts
interface IFirstController {
getRelevantData(next: (error: string, response: any) => void): void;
}
// secondController.ts
secondController extends firstController implements iSecondController {
private static listOfDept: string[];
static checkStart(){
firstController.listOfDept = ["Computer Science"];
}
constructor (){
super();
}
}
secondController.checkStart();
export = secondController;
//isecondController.ts
interface ISecondController implements ifirstController{}
//Controller calling the getRelevantData function
//middlewareController
middlewareController implements IMiddlewareController {
constructor(private firstController: IFirstController, private secondController: ISecondController) {
}
getDepData(data: any, next: (error: string, response: any) => void): void {
if(data.url = "fromParent") {
// im expecting this to make a call to checkStart() of firstController
this.firstController.getRelevantData();
} else {
// im expecting this to make a call to checkStart() of secondController
this.secondController.getRelevantData();
}
}
}
上述代码面临的问题
无论以何种方式调用getRelevantData函数,我都会得到listOfDept作为计算机科学的价值。在first controller的checkStart函数中永远不会出现这种情况。一般来说,我不建议使用静态方法进行此类初始化,而是将所需的数据注入构造函数或创建工厂方法来创建具有必要数据的对象
// firstController.ts
firstController implements IFirstController {
private static listOfDept: string[];
static checkStart(){
firstController.listOfDept = // my logic to fill this object
}
constructor (){}
}
getRelevantData(next: (error: string, response: any) => void): void {
var myObject = firstController.listOfDept;
this.myRepository.uniqueData(myObject, next);
}
}
firstController.checkStart();
export = firstController;
//ifirstController.ts
interface IFirstController {
getRelevantData(next: (error: string, response: any) => void): void;
}
// secondController.ts
secondController extends firstController implements iSecondController {
private static listOfDept: string[];
static checkStart(){
firstController.listOfDept = ["Computer Science"];
}
constructor (){
super();
}
}
secondController.checkStart();
export = secondController;
//isecondController.ts
interface ISecondController implements ifirstController{}
//Controller calling the getRelevantData function
//middlewareController
middlewareController implements IMiddlewareController {
constructor(private firstController: IFirstController, private secondController: ISecondController) {
}
getDepData(data: any, next: (error: string, response: any) => void): void {
if(data.url = "fromParent") {
// im expecting this to make a call to checkStart() of firstController
this.firstController.getRelevantData();
} else {
// im expecting this to make a call to checkStart() of secondController
this.secondController.getRelevantData();
}
}
}
但是,如果您确实希望使用静态属性,那么问题是您需要在getRelevantData
实现中引用正确的父类。构造实例的类可以通过constructor
属性访问。TypeScript无法很好地处理此场景,因此您必须进行类型转换:
//firstController.ts
类firstController实现IFirstController{
//需要“保护”才能从子类访问
受保护的静态listOfDept:字符串[];
静态checkStart(){
firstController.listOfDept;//填充此对象的逻辑
}
构造函数(){}
getRelevantData(下一步:(错误:字符串,响应:任意)=>void):void{
//您需要参考构造函数
让Class=this.constructor作为firstController的类型;
var myObject=Class.listOfDept;
//其余的
}
}
firstController.checkStart();
//ifirstController.ts
接口IFirstController{
getRelevantData(下一步:(错误:字符串,响应:任意)=>void):void;
}
//第二控制器
类secondController扩展firstController实现ISecondController{
//此处没有“listOfDept”定义
静态checkStart(){
secondController.listOfDept=[“计算机科学”];
}
构造函数(){
超级();
}
}
secondController.checkStart();