TypeScript中如何在子类指定基类属性的类型?
解决方案:将基类改造为泛型类
你的问题根源在于基类Base的collection属性被固定为ICollection<object>,子类继承后无法自动将该属性的类型收缩为更具体的ICollection<User>。最优解是把基类改成泛型类,让类型可以在子类中动态指定,完全避免重复的类型断言或属性重写。
修改后的代码示例
首先重构基类为泛型类:
class Base<T> { protected collection: ICollection<T> public constructor(collection: ICollection<T>) { this.collection = collection } }
然后子类继承时指定具体的泛型参数User:
class Child extends Base<User> { public constructor(collection: ICollection<User>) { super(collection) } private foo(): void { // 此处this.collection会被TypeScript正确识别为ICollection<User> // 可直接操作,无需任何类型断言 } }
备选方案:重写子类属性(不推荐)
如果因历史代码限制无法修改基类,可在子类中重新声明collection属性并指定类型,但这种方式需要额外赋值,且可能破坏基类封装,仅作为临时妥协方案:
class Child extends Base { protected collection: ICollection<User>; public constructor(collection: ICollection<User>) { super(collection); this.collection = collection; // 必须重新赋值以覆盖基类的object类型 } private foo(): void { // 现在this.collection为ICollection<User>类型 } }
综上,泛型基类是类型安全、可维护性最高的解决方案,能从根源上解决类型不匹配的问题。
内容的提问来源于stack exchange,提问作者Alexander Petrushyn
相关产品推荐
相关产品推荐

