TypeScript 泛型函数如何自动推导返回值且仅指定单个泛型参数
解决方案
利用 TypeScript 泛型的推断规则,将需要手动指定的泛型和需要自动推导的泛型通过柯里化拆分到两层函数中,修改后的代码如下:
function f<T>() { return function <R>(f: (v: Partial<T>) => R): R { return f({}) } } const res = f<number>()((v) => 0) // res 类型自动推导为 number
原理说明
TypeScript 目前不支持泛型参数的部分指定:调用泛型函数时,要么所有泛型参数都手动传入,要么全部由 TypeScript 自动推断。
- 最初的单泛型写法中,返回值直接定义为
any,导致类型推断失效 - 双泛型的写法要求必须同时传入两个泛型参数,无法满足只指定
T的需求
拆分两层函数后,第一层函数仅接收需要手动指定的T泛型,调用时手动传入number即可;返回的第二层函数的泛型R会自动根据传入的回调函数返回值推导,不需要手动指定,最终返回值类型即可正确推导。
可选替代方案(无需额外括号)
如果不想多写一层括号调用,可以新增一个无实际作用的占位参数用来传递T的类型:
function f<T, R>(_typeSample: T, f: (v: Partial<T>) => R): R { return f({}) } const res = f(0 as number, (v) => 0) // res 类型同样推导为 number
内容的提问来源于stack exchange,提问作者rxliuli
相关产品推荐
相关产品推荐

