You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.02 03:24:00