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

TypeScript泛型报错:类型'T'不存在属性'input'问题咨询

为什么泛型默认类型写法和直接联合类型写法的类型检查结果不同?

泛型默认类型只是调用时未显式指定泛型参数的 fallback 值,并没有限制泛型的取值范围。你写的<T = InputData | Omit<InputData, "output">>,意味着调用者可以传入任意类型作为T,比如normalize<{foo: string}>({foo: "bar"}),这种情况下T完全没有input属性,所以TypeScript会提前报错提示input不存在于类型T。

而直接把参数类型写成InputData | Omit<InputData, "output">时,TypeScript会分析这个联合类型的共有属性:因为InputData和Omit<InputData, "output">都保留了input属性(Omit仅移除了output字段),所以TypeScript能确定不管参数是联合类型里的哪一种,input属性都一定存在,因此允许直接访问company.input。

如果想让泛型版本正常工作,需要给T加上类型约束,明确限制T必须是目标联合类型的子类型,比如:

function normalize<T extends InputData | Omit<InputData, "output">>(
    company: T
): any {
    console.log(company.input.numberOfWorker);
}

这样TypeScript就会确保T必然包含input属性,不会再出现类型错误。

内容的提问来源于stack exchange,提问作者Thibaud

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 10:01:23