TypeScript中继承类与父类类型不兼容问题咨询
问题分析与解决方案
别急,TypeScript当然支持类继承啦!你遇到的报错根本不是继承的问题,而是对「实例类型」和「构造函数类型」的混淆导致的~
为什么会报错?
你定义的ConditionModel接口里,class: Conditions指定的是**Conditions的实例类型**——也就是调用new Conditions()后得到的对象的类型。但你往数组里传入的BoolConditions、TextConditions是类本身(构造函数),它们的类型是typeof BoolConditions和typeof TextConditions,这和Conditions实例类型完全不是一回事,TypeScript自然会提示不兼容。
怎么解决?
只需要把接口里class的类型改成构造函数类型typeof Conditions就行。因为子类的构造函数类型是继承自父类构造函数类型的,typeof BoolConditions可以安全赋值给typeof Conditions。
修正后的完整代码示例:
// 抽象父类 abstract class Conditions { abstract validate(input: unknown): boolean; } // 子类实现 class BoolConditions extends Conditions { validate(input: unknown): boolean { return typeof input === 'boolean'; } } class TextConditions extends Conditions { validate(input: unknown): boolean { return typeof input === 'string'; } } // 修改后的接口:class字段为构造函数类型 export interface ConditionModel { type: string; class: typeof Conditions; } // 现在这个数组完全符合类型要求,不会报错 export const myConditions: ConditionModel[] = [ { type: 'bool', class: BoolConditions }, { type: 'text', class: TextConditions } ];
额外说明
如果你的需求是存储类的实例(而不是类本身),那应该传入new BoolConditions()这样的实例对象,此时接口里的class: Conditions就是正确的——但从你的代码写法来看,你显然是想存储类本身用于后续实例化,所以用构造函数类型才是正确的选择。
内容的提问来源于stack exchange,提问作者piernik
相关产品推荐
相关产品推荐

