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
相关产品推荐
相关产品推荐

