如何在打字稿中扩展类

问题描述 投票:0回答:1

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

注意:

下面的代码仅是说明情况的代码片段,而不是应用程序的实际代码。但是此代码段的命令/调用/控制器结构完全相同。同样,在firstController和secondController的checkStart函数中,listOfDept变量将具有单独的业务逻辑。

// 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个回答
0
投票

通常,我不鼓励使用静态方法进行此类初始化,而是将所需的数据注入到构造函数中,或者创建用于使用必要数据创建对象的工厂方法。

但是,如果您确实想使用静态属性,则问题在于您需要在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();
© www.soinside.com 2019 - 2024. All rights reserved.