TS:在实现接口的抽象类的实现中缺少可选成员的类型

时间:2018-05-15 14:53:32

标签: javascript typescript

游乐场代码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?有没有办法强制执行这种行为?

1 个答案:

答案 0 :(得分:1)

如果AbstractFoo实现IFoo的方式存在类型错误,则会导致错误。 IFooAbstractFoo类型和以任何其他方式扩展它的类型无关。它不会对其子项强制执行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 {...}