TypeScript抽象类实现接口时可选成员类型检查缺失问题问询
如何强制子类满足父类实现的接口约束?
有两种简单可靠的方式可以实现这个需求:
方法1:在父类中显式声明接口的可选成员类型
哪怕父类不实现这个可选方法,只要把它的类型明确写出来,子类再定义该成员时就会被父类的类型约束住:
interface IFoo { bar: number; foo?: () => void; } abstract class AbstractFoo implements IFoo { bar = 42; foo?: () => void; // 显式声明可选成员的类型 } class ConcreteFoo1 extends AbstractFoo { foo: string; // 现在会报错:类型'string'不能赋值给类型'(() => void) | undefined' }
方法2:让子类显式实现接口
这就是你例子里ConcreteFoo2的做法,直接让子类加上implements IFoo,TypeScript会直接校验子类是否符合接口的所有规则:
class ConcreteFoo2 extends AbstractFoo implements IFoo { foo(arg: number) { } // 报错:类型'(arg: number) => void'不能赋值给类型'(() => void) | undefined' }
额外小技巧:用工具类型隐式约束
如果你不想重复写接口名称,可以用工具类型来强制子类满足接口约束:
type EnsureImplements<T, U> = T extends U ? T : never; class ConcreteFoo1 extends AbstractFoo implements EnsureImplements<ConcreteFoo1, IFoo> { foo: string; // 同样会触发类型错误 }
内容的提问来源于stack exchange,提问作者Amadare42
相关产品推荐
相关产品推荐

