TypeScript泛型函数参数类型推断优化:使get3参数为undefined
TypeScript泛型函数参数类型推断问题
我定义了一个包含两种函数类型的泛型参数:一种接收两个参数,另一种仅接收一个参数:
const fn = <K, P, R>(inputfn: ((key: K) => R) | ((key: K, params: P) => R))
该函数内部有一个名为get的函数:
function get(params: P)
完整代码如下:
const fn = <K, P, R>(inputfn: ((key: K) => R) | ((key: K, params: P) => R)) => (api: K) => { function get(params: P) { return 'get' } return get }
以下是几个使用案例:
const get1 = fn((key: string, params: string) => ({ [key]: params }))('foo') // 参数类型正确 const get2 = fn((key: string, params?: string) => ({ [key]: params }))('foo') // 参数类型正确 const get3 = fn((key: string) => ({ [key]: 'params' }))('foo') // 参数类型为unknown
可以看到,最后一个案例中get3函数的params类型被推断为unknown。我希望TypeScript能将其正确推断为undefined,这样调用get3时无需传入参数,TypeScript也不会报错。
解决方案
方法一:给泛型参数设置默认类型并适配可选参数
问题核心是当传入单参数输入函数时,TypeScript无法确定P的类型,默认推断为unknown。给P设置默认类型undefined,同时将get的参数设为可选,就能让类型推断符合预期:
const fn = <K, P = undefined, R>(inputfn: ((key: K) => R) | ((key: K, params: P) => R)) => (api: K) => { function get(params?: P) { return 'get' } return get }
修改后,get3的params类型会被推断为undefined,调用get3()不会触发类型错误,同时get1和get2的类型推断逻辑保持正常。
方法二:使用函数重载明确区分场景
如果需要更严格的类型约束,可以通过函数重载分别定义单参数和双参数输入的情况,让TypeScript精准匹配对应的返回类型:
// 重载签名1:输入单参数函数,返回无参数的get函数 function fn<K, R>(inputfn: (key: K) => R): (api: K) => () => string // 重载签名2:输入双参数函数,返回带P类型参数的get函数 function fn<K, P, R>(inputfn: (key: K, params: P) => R): (api: K) => (params: P) => string // 实现签名 function fn<K, P, R>(inputfn: ((key: K) => R) | ((key: K, params: P) => R)) { return (api: K) => { return (params?: P) => { return 'get' } } }
这种方式下:
get3会被推断为() => string,调用时无需传参get1和get2的参数类型推断依然准确
内容的提问来源于stack exchange,提问作者Martin
相关产品推荐
相关产品推荐

