TypeScript泛型高阶函数添加参数默认值的类型推断问题
报错根因
你之前的写法报错是因为泛型T由调用侧决定,理论上调用时可以指定任意类型的T,但你提供的默认参数固定返回number,无法匹配所有可能的T类型,因此TypeScript会抛出类型不兼容的错误。
解决方案
推荐使用函数重载的方式区分无参、有参两种调用场景,不需要额外类型断言,类型安全性更高:
// 重载1:无参数调用时,默认返回接收字符串返回数字的函数 function someFunction(): (s: string) => number // 重载2:传入转换函数时,根据转换函数的返回值自动推断泛型 function someFunction<T>(f: (s: string) => T): (s: string) => T // 函数实现,兼容两种重载逻辑 function someFunction(f: (s: string) => unknown = (s: string) => Number(s)) { return function(s: string) { return f(s) } }
如果你想要更简洁的写法,也可以给泛型添加默认类型,搭配类型断言实现:
// 给泛型T指定默认类型为number,默认参数加类型断言保证类型兼容 function someFunction<T = number>(f: (s: string) => T = (s: string) => Number(s) as unknown as (s: string) => T) { return function(s: string): T { return f(s) } }
效果验证
两种方案都可以同时满足默认参数和自定义传入函数的类型推断需求:
// 无参调用,默认返回number类型的函数 const defaultFunc = someFunction() // ^ const defaultFunc: (s: string) => number // 传入返回string的函数,自动推断返回类型为string const funcStr = someFunction((s: string) => s) // ^ const funcStr: (s: string) => string // 传入返回number的函数,自动推断返回类型为number const funcNum = someFunction((s: string) => Number(s)) // ^ const funcNum: (s: string) => number
内容的提问来源于stack exchange,提问作者MauricioRobayo
相关产品推荐
相关产品推荐

