TypeScript中装饰器存储子类实例后无法自动推断子类成员的问题
TypeScript中装饰器存储子类实例后无法自动推断子类成员的问题
嗨,我完全懂你的烦恼——每次调用子类专属方法都要写类型断言,实在太繁琐了。问题根源在于你的Decorator类把model属性的类型固定成了BaseModel,TypeScript只能识别基类的成员,自然没法追踪到具体子类的专属方法。
解决这个问题的最优方案是给Decorator类加上泛型约束,让它能自动推断并保留传入实例的具体子类类型。改造后的代码如下:
class BaseModel { property = 'random' } class ModelA extends BaseModel { methodA() {} } class ModelB extends BaseModel { methodB() {} } // 给Decorator添加泛型,约束T必须是BaseModel的子类 class Decorator<T extends BaseModel> { model: T; constructor(model: T) { this.model = model; } // 装饰器的其他方法可以正常保留 } // TypeScript会自动推断modelContainerA的model为ModelA类型 const modelContainerA = new Decorator(new ModelA); // 直接调用methodA完全没问题,无需断言 modelContainerA.model.methodA(); const modelContainerB = new Decorator(new ModelB); // 同理,methodB能被TypeScript正确识别 modelContainerB.model.methodB();
这样改造后,Decorator会根据你传入的具体子类实例,自动推导泛型T的类型,model属性的类型就会对应具体的子类(比如ModelA或ModelB),而不是笼统的BaseModel。你再也不用手动写类型断言,TypeScript能准确识别每个子类的专属方法和属性。
额外补充:因为泛型约束了T extends BaseModel,所以你在装饰器的方法里操作基类的通用属性(比如property)时,也完全不用担心类型问题,TypeScript会确保model拥有基类的所有成员。
备注:内容来源于stack exchange,提问作者crazy_abdul
相关产品推荐
相关产品推荐

