TypeScript:如何获取指定参数元组的泛型函数实例返回类型?
问题描述
假设有这样一个泛型函数:
function example<T>(a: T, b: number): SomeType<T> { // 代码实现 }
我的目标是,在不清楚该函数泛型参数对应关系(比如泛型是基于第一个参数类型、第二个参数类型,还是存在两个泛型参数)的前提下,确定它接收参数元组[string, number]时的实例化返回类型。理想状态下能有一个工具类型InstantiatedReturnType<F, ParamTuple>,让InstantiatedReturnType<typeof example, [string, number]>等价于SomeType<string>。
目前已确认typeof example确实兼容(...args: [string, number]) => any类型,但始终无法提取对应参数元组类型的实例化返回类型:
- 尝试将
typeof example与(...args: [string, number]) => any取交集,ReturnType<>的结果会根据交集顺序不同,变成any或unknown; - 由于函数参数是逆变的,尝试取联合类型的
ReturnType<>也没有效果。
需要说明的是,我不能直接使用ReturnType<typeof example<string>>,因为匹配参数元组[string, number]的实例化可能是example<number>——比如该函数的泛型参数实际对应第二个参数类型,第一个参数被显式定义为string。我的实际场景是:给定一个对象,其值是可供调用的候选函数(部分为泛型函数),我需要根据已有参数元组类型选择合适的函数调用,选择对应键的逻辑已经实现,但无法表达该调用的返回类型。
更新:我做了一个精简示例,实现了选择正确键的逻辑,同时包含一次获取匹配实例返回类型的失败尝试。
内容的提问来源于stack exchange,提问作者Glen Whitney
相关产品推荐
相关产品推荐

