TypeScript如何根据入参函数返回值推导包装函数的返回类型
问题描述
有一个接收函数作为入参的函数,入参函数的返回值属于若干枚举/字面量值中的一种,如何通过入参函数的返回类型,推导外层包装函数的返回类型?
示例场景如下:
const foo = { a: 1, b: '2' } function h(k: (() => 'a' | 'b')) { return foo[k()] } const d = h(() => 'a') // 预期:d的类型为number // 实际:d的类型为number | string
解决方案
你需要通过泛型捕获入参函数的返回字面量类型,再结合索引访问类型映射出外层函数的返回类型,具体实现如下:
const foo = { a: 1, b: '2' } // 泛型T约束为foo的合法键类型,入参函数返回T,外层函数返回foo对应T的属性类型 function h<T extends keyof typeof foo>(k: () => T): typeof foo[T] { return foo[k()] } const d = h(() => 'a') // 此时d的类型符合预期为number const e = h(() => 'b') // e的类型符合预期为string
原理解释
- 原写法将入参函数的返回类型固定写死为
'a' | 'b'联合类型,TS无法捕获每次调用时传入的具体返回值类型,自然只能推导出联合的返回值类型。 - 新增的泛型参数
T会在每次调用h函数时,自动根据入参函数的返回值推导对应的具体字面量类型(比如调用时传入返回'a'的函数,T就会被推导为'a'而非联合类型)。 - 最后通过索引访问类型
typeof foo[T]就能精准映射出对应属性的类型。
内容的提问来源于stack exchange,提问作者david_adler
相关产品推荐
相关产品推荐

