Erh*_*nis 5 inheritance typescript
考虑以下:
class A {
commonString: string = "common";
}
class B extends A {
bString: string = "b";
}
class C extends A {
cString: string = "c";
}
Run Code Online (Sandbox Code Playgroud)
在我看来,这就像一个非常普通的继承例子——事实上,这是最基本的例子之一。然而,如果我没看错的话,TypeScript 的继承机制不支持这种模式?考虑以下两个来源:
https://www.javatpoint.com/typescript-inheritance - “当从一个基类继承多个子类时,这种类型的继承称为层次继承。...TypeScript 不支持层次继承。”
https://www.w3spoint.com/inheritance-typescript - 在列出另一篇文章列出的五种继承类型后,说“TypeScript 仅支持单级继承和多级继承”。
我觉得这很难相信,原因有二:
b: B = B()行为如预期:如果我访问b.bString它很好,如果我访问b.cString它错误,如果我存储b: A = new B(),它可以工作,但如果我访问则编译错误b.bString(但在运行时bString实际上存在)。它的行为完全符合我的预期。那么,这是怎么回事?我是否误解了“层次继承”?给出的文章有错吗?Typescript 是否声称不支持它,但实际上它支持?我的编译器受到侏儒的祝福了吗?
更重要的是,我可以相信通常的“B 扩展 A,C 扩展 A”能够继续按预期工作吗?
是的,TypeScript 当然支持“分层继承”,尽管我以前从未听说过这个术语(或者至少没有以与“单一继承”形成对比的方式)。我建议使用TypeScript 手册和microsoft/TypeScript GitHub 存储库作为有关 TypeScript 功能的更权威的信息来源,而不是咨询 javatpoint.com 和 w3spoint.com。
如果您查看TypeScript 手册中有关类继承的部分,您会发现以下示例代码:
class Animal {
name: string;
constructor(theName: string) {
this.name = theName;
}
move(distanceInMeters: number = 0) {
console.log(`${this.name} moved ${distanceInMeters}m.`);
}
}
class Snake extends Animal {
constructor(name: string) {
super(name);
}
move(distanceInMeters = 5) {
console.log("Slithering...");
super.move(distanceInMeters);
}
}
class Horse extends Animal {
constructor(name: string) {
super(name);
}
move(distanceInMeters = 45) {
console.log("Galloping...");
super.move(distanceInMeters);
}
}
Run Code Online (Sandbox Code Playgroud)
它清楚地表明Animal有两个子类,Snake如Horse;这是一个类的层次结构,它的行为与您所期望的完全一样。
我真的不能说 javatpoint.com 和/或 w3spoint.com 是否通常是可靠的信息来源,这是一个不幸但罕见的准确性失误,或者它们是否完全不可靠,或者介于两者之间。从我对这些网站内容的不科学随机抽样来看,我猜测作者不一定是以英语为母语,而且即使源材料是正确的,它也可能不够清楚地传达以供依赖。