我正在尝试创建一个抽象类,但是事情并没有按我希望的那样进行,我担心我对打字稿的了解是有限的,因为我认为这是一个相当通用的用例。
我有一个抽象类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。
答案 0 :(得分:1)
您似乎真的希望Program
的所有具体子类实现IProgram
,因为您在this.childFunc()
的定义中引用了Program
。如果是这样,则应声明Program
实现IProgram
,在childFunc
和mark 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'.
}
希望有帮助。祝你好运!