如何推断类方法的未知返回类型并将其用于类属性?
解决方案:通过泛型抽象类实现类型推断
可以实现,核心是将抽象类定义为泛型抽象类,让TypeScript根据子类initialize方法的返回值自动推断泛型参数类型,从而约束prop的类型。
完整实现代码
class Base { method_1() {} } class Child extends Base { method_2() {} } // 将抽象类定义为泛型类,泛型C约束为Base的子类 abstract class AbstractClass<C extends Base> { prop!: C; // 用!断言避免初始化报错,或在构造函数中赋值 // 抽象方法返回类型为泛型C abstract initialize(): C; } class UserClass1 extends AbstractClass { initialize() { return new Base(); } someMethod() { this.prop.method_1(); // ✅ 类型正确,无报错 this.prop.method_2(); // ❌ 报错:Base不存在method_2方法 } } class UserClass2 extends AbstractClass { initialize() { return new Child(); } someMethod() { this.prop.method_1(); // ✅ 类型正确,无报错 this.prop.method_2(); // ✅ 类型正确,无报错 } }
关键说明
- 泛型约束:
AbstractClass<C extends Base>确保C必须是Base或其子类,符合你对initialize返回值的要求 - 自动推断:子类继承
AbstractClass时,无需手动指定C的类型,TypeScript会根据initialize方法的返回值自动推断出C的具体类型 - 类型安全:
prop的类型会同步为推断出的C类型,因此在调用方法时会得到准确的类型检查
内容的提问来源于stack exchange,提问作者Khanon
相关产品推荐
相关产品推荐

