考虑以下打字稿代码:
interface MyInterface {
foo?(x : string) : void;
}
class One implements MyInterface {
}
class Two extends One implements MyInterface {
foo(x : number) : void {
}
}
编译此将按预期引发错误:类型'Two'的属性'foo'无法分配给基本类型'MyInterface'的相同属性。
[当我删除第二类中的“ implements MyInterface”时,错误消失了。我本来希望类2从类1继承一个事实,即它实现了MyInterface,因此仍应与之兼容。
出于Java的背景,我认为我误解了TS中的类型系统,尤其是子类实例是否是“是”超类实例。为了验证,我在类One中添加了带有字符串参数的方法,但这引发了错误:类型'Two'中的属性'foo'无法分配给基本类型'One'中的同一属性-再次导致我TS子类与Java一样具有“ is-a”关系的结论。但这意味着我仍然不理解为什么类2不从类1继承其实现MyInterface的事实。
我怎么了?
方法签名在您的接口和已实现的类中是不同的。您应该在名为Two的类中更改foo(x:string)。
interface MyInterface {
foo?(x : string) : void;
}
class One implements MyInterface {
}
class Two extends One implements MyInterface {
foo(x : string) : void {
}
}