游乐场代码here
实施例:
interface IFoo {
bar: number;
foo?: () => void;
}
abstract class AbstractFoo implements IFoo {
bar = 42;
};
由于foo
是可选的,因此我不需要在AbstractFoo
中实施它。但是,我可以在AbstractFoo
的孩子中实现它。因此,我希望以下代码无法编译,因为foo
实现了错误:
class ConcreteFoo1 extends AbstractFoo {
foo: string; // type for "foo" isn't checked
}
但TS不对IFoo
的可选成员进行任何类型检查。除非我明确地实现它。然后编译器将按预期执行类型检查:
class ConcreteFoo2 extends AbstractFoo implements IFoo {
foo(arg: number) { } // error when implementing IFoo explicitly
}
所以我的问题是:为什么打字稿不会隐含地为具体类实现接口IFoo?有没有办法强制执行这种行为?
答案 0 :(得分:1)
如果AbstractFoo
实现IFoo
的方式存在类型错误,则会导致错误。 IFoo
与AbstractFoo
类型和以任何其他方式扩展它的类型无关。它不会对其子项强制执行foo
属性类型,因为它们不知道AbstractFoo
实现IFoo
的事实。
这是IFoo
影响子课程的方式:
class ConcreteFoo extends AbstractFoo implements IFoo {...}
如果应该设置正确的继承,这意味着IFoo
也应该是一个类:
abstract class AbstractFoo {
bar: number;
foo?: () => void;
}
abstract class BaseFoo extends AbstractFoo {
bar = 42;
};
class ConcreteFoo extends BaseFoo {...}