Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/33.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js 如何在typescript中扩展类_Node.js_Typescript_Oop_Implements - Fatal编程技术网

Node.js 如何在typescript中扩展类

Node.js 如何在typescript中扩展类,node.js,typescript,oop,implements,Node.js,Typescript,Oop,Implements,我的服务是用nodejs设计的。 下面是我的情景 我有两个控制器,一个将扩展另一个。两个控制器中都有一个静态函数,其中静态变量将被赋值。 根据数据的条件,我尝试调用相应的控制器,以便静态变量获得适当的赋值 注意: 下面的代码只是解释场景的一个片段,而不是应用程序的实际代码。但此代码段的顺序/调用/控制器结构完全相同。此外,listOfDept变量在firstController和secondController的checkStart函数中将具有单独的业务逻辑 // firstController

我的服务是用nodejs设计的。 下面是我的情景 我有两个控制器,一个将扩展另一个。两个控制器中都有一个静态函数,其中静态变量将被赋值。 根据数据的条件,我尝试调用相应的控制器,以便静态变量获得适当的赋值

注意:

下面的代码只是解释场景的一个片段,而不是应用程序的实际代码。但此代码段的顺序/调用/控制器结构完全相同。此外,listOfDept变量在firstController和secondController的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函数,我都会得到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();