TypeScript基于入参的条件返回类型匹配undefined时失效如何解决
问题原因
你写的条件类型失效的核心原因是:不传参数调用func()时,TypeScript 不会自动将泛型T推断为undefined,而是会推断为unknown,unknown extends undefined的判断结果为假,自然就返回了string类型,和预期不符。
解决方案
方案1:给泛型添加默认值
给泛型T指定默认值为undefined即可对齐预期:
// 给T添加默认类型undefined const func = <T = undefined>(arg?: T): T extends undefined ? number : string => { if(arg) return 's' as any else return 10 as any } let ff1 = func() // 类型为number,符合预期 let ff2 = func(123) // 类型为string,符合预期
方案2:使用函数重载(更推荐)
这种参数场景只有两种情况,用函数重载写法更直观,也不需要强转any,类型安全性更高:
function func(): number function func<T>(arg: T): string function func(arg?: unknown) { if(arg !== undefined) return 's' return 10 } let ff1 = func() // number let ff2 = func('test') // string
内容的提问来源于stack exchange,提问作者Eliav Louski
相关产品推荐
相关产品推荐

