使用索引签名扩展类

时间:2019-04-18 14:30:47

标签: typescript

我正在尝试创建一个抽象类,但是事情并没有按我希望的那样进行,我担心我对打字稿的了解是有限的,因为我认为这是一个相当通用的用例。

我有一个抽象类Program。 这个抽象类具有许多功能和属性。

abstract class Program {
  someString: string = "bob";
  someFunc(): void {
    return;
  }
  someOtherfunc: void {
    this.childFunc();
    return; 
  }
}

我也有一个看起来像这样的接口“ IProgram”

interface IProgram {
  childFunc: () => void; 
}

class Child像这样扩展class Program并实现“ IProgram”接口

class Child extends Program implements IProgram {
  childFunc(): void {
    console.log("Hello World")
  }
}

所以我不能在没有某种破坏性(IMHO)行为的情况下使它起作用。

我尝试将索引签名添加到“程序” 那行我没有TS错误,但随后在子程序中一切正常。我不在乎在IProgram中丢失验证,因为这不会更改,但是我不希望子程序能够运行:

this.bob = 'potato'; //TS wont give an error because of index signature in parent

我也曾尝试在Abstract类中将'childFunc'声明为any类型,但随后它抱怨说它应该是一个函数而不是成员。声明它的另一个问题是,当TS在标头中找到子类时,不再强制我的子类实现“ IProgram”来实现“ childFunc”。

我也做了最少的堆栈重复处理此问题的方法

https://stackblitz.com/edit/typescript-po7hbo

我基本上只是希望抽象类接受其所有子代都将声明这些funcs / properties。

1 个答案:

答案 0 :(得分:1)

您似乎真的希望Program的所有具体子类实现IProgram,因为您在this.childFunc()的定义中引用了Program。如果是这样,则应声明Program实现IProgram,在childFuncmark it as abstract内部声明Program方法:

abstract class Program implements IProgram {

  abstract childFunc(): void; // marked as abstract

  someString: string = "bob";
  someFunc(): void {
    return;
  };
  someOtherfunc(): void {
    this.childFunc(); // okay now
    return;
  };  
}

// you can remove the "implements IProgram" from Child since the parent has it
class Child extends Program {
  childFunc(): void {
    console.log("Hello World")
  }
}

声明了抽象方法但未在其抽象类中实现抽象方法,所有具体的子类都必须实现它们或得到错误:

class Oops extends Program { // error!
//    ~~~~ 
// Non-abstract class 'Oops' does not implement inherited 
// abstract member 'childFunc' from class 'Program'.
}

希望有帮助。祝你好运!