【问题标题】:How to extend a class in typescript如何在打字稿中扩展一个类
【发布时间】:2020-03-26 22:49:40
【问题描述】:

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

注意:

下面的代码只是一个解释场景的sn-p,而不是应用程序的实际代码。但是这段代码sn-p的顺序/调用/控制器结构是完全一样的。此外,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 作为计算机科学的值。它永远不会进入第一个控制器的 checkStart 函数。

【问题讨论】:

    标签: node.js typescript oop implements


    【解决方案1】:

    一般来说,我不鼓励使用静态方法进行这种初始化,而是将所需的数据注入构造函数或创建工厂方法来创建具有必要数据的对象。

    但是,如果您确实想使用静态属性,问题是您需要在getRelevantData 实现中引用正确的父类。可以通过constructor 属性访问构造实例的类。 TypeScript 不能很好地处理这种情况,所以你必须进行类型转换:

    // firstController.ts
    class firstController implements IFirstController {
      // Need to be `protected` to be accessible from subclass
      protected static listOfDept: string[];
      static checkStart(){
        firstController.listOfDept; // my logic to fill this object
      }
    
      constructor (){}
    
      getRelevantData(next: (error: string, response: any) => void): void {
        // You need to refer to the constructor
        let Class = this.constructor as typeof firstController;
        var myObject = Class.listOfDept;
        // the rest
      }
    }
    firstController.checkStart();
    
    //ifirstController.ts
    
    interface IFirstController {
        getRelevantData(next: (error: string, response: any) => void): void;
    }
    
    // secondController.ts
    class secondController extends firstController implements ISecondController {
        // No `listOfDept` definition here
        static checkStart(){
            secondController.listOfDept = ["Computer Science"];
        }
        constructor (){
            super();
        }
    }
    secondController.checkStart();
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-06-11
      • 2017-04-27
      • 1970-01-01
      • 2021-06-18
      • 2016-07-04
      • 1970-01-01
      相关资源
      最近更新 更多