TypeScript使用泛型参数时fireEvent类型报错原因求解
报错原因
第一段代码的父类泛型使用了当前类的未确定泛型参数索引结果T['LISTENER']:
TypeScript在类定义阶段不会将泛型的默认值作为推导的唯一依据,而是会考虑所有符合T extends BaseEntityGenerics约束的可能传入类型。你可以自定义符合约束的T类型,让其LISTENER接口的lockChanged事件要求参数包含额外字段,此时你写死的{ locked: true }就不符合自定义类型的要求,TS会提前抛出错误避免这种风险。
第二段代码无报错的原因
你直接将父类BaseObserver的泛型写死为固定类型BaseEntityListener,TS可以直接解析出该类型下fireEvent方法的入参要求:lockChanged事件仅需要locked字段即可,和你传入的参数匹配,因此校验通过。
修复方案
如果需要保留BaseEntity的泛型扩展能力,可以通过类型断言明确参数合法性:
public setLocked(locked: boolean = true) { this.fireEvent( { locked: true } as Parameters<T['LISTENER']['lockChanged']>[0], 'lockChanged' ); }
如果不需要扩展LISTENER类型,直接像第二段代码一样将父类泛型写死为BaseEntityListener即可。
内容的提问来源于stack exchange,提问作者rkesters
相关产品推荐
相关产品推荐

