Typescript带条件类型的泛型函数返回值报ts2322错误是什么原因?
问题根因
TypeScript 不会对未绑定具体类型的泛型条件类型做提前的分支推导。你虽然给泛型参数 T 加了 extends string 的约束,但只要 T 还是一个可传入的泛型参数、没有被替换为具体的 string 类型,TypeScript 就不会主动解析 A<T> 中 value 字段的条件判断分支,只会把它当成一个未确定的待解析类型,因此无法直接匹配你返回的 {a: T, b: T} 结构。
可行解决方案
方案1:使用类型断言
既然你已经通过泛型约束确定了 T 必然是字符串类型,value 的结构一定符合条件类型的第一个分支,直接给返回值加类型断言即可:
function myFunc<T extends string>(prop: T): A<T> { return { prop, value: { a: prop, b: prop } as A<T>['value'] } }
也可以直接断言整个返回对象:
function myFunc<T extends string>(prop: T): A<T> { return { prop, value: { a: prop, b: prop } } as A<T> }
方案2:使用函数重载分离签名和实现
通过重载对外暴露泛型签名,内部实现用具体类型规避未解析条件类型的问题:
function myFunc<T extends string>(prop: T): A<T> function myFunc(prop: string): A<string> { return { prop, value: { a: prop, b: prop } } }
内容的提问来源于stack exchange,提问作者Richard Walton
相关产品推荐
相关产品推荐

