TypeScript如何根据rest参数形状自动推断函数返回类型
你当前实现的核心问题是泛型参数K和实际传入的参数列表没有建立关联,所以TS无法根据入参数量自动推导返回类型,必须手动指定泛型。
最优实现方案:类方法重载
这是最符合TS类型系统设计、也最容易维护的方案,完全满足你自动推断返回类型的需求:
class A<T> { // 重载1:传入单个参数,返回单个处理结果 transform(value: T): T // 重载2:传入多个参数,返回处理后的数组 transform(...values: T[]): T[] // 实现签名(不需要对外暴露) transform(...values: T[]): T | T[] { // 这里替换为你的实际转换逻辑,示例为每个值+1 const processed = values.map(val => { return (val as number + 1) as unknown as T }) // 按参数长度返回对应格式结果 return processed.length === 1 ? processed[0] : processed } } // 测试效果 const a = new A<number>() const single = a.transform(1) // 类型自动推断为number const multi = a.transform(1,2,3) // 类型自动推断为number[]
可选方案:可变元组类型推断
如果不想用重载,也可以通过infer推断参数元组长度实现同样效果:
type TransformResult<T, Args extends T[]> = Args['length'] extends 1 ? T : T[] class A<T> { transform<Args extends T[]>(...values: Args): TransformResult<T, Args> { const processed = values.map(val => { // 替换为你的处理逻辑 return (val as number + 1) as unknown as T }) return (processed.length === 1 ? processed[0] : processed) as TransformResult<T, Args> } }
注意事项
如果调用时传入的是动态长度的数组展开参数(比如const arr = [1,2,3]; a.transform(...arr)),因为TS编译期无法确定数组长度,返回类型会自动推断为T | T[],这类场景如果需要固定返回数组,额外加一个接收数组参数的重载即可。
内容的提问来源于stack exchange,提问作者RamblinRose
相关产品推荐
相关产品推荐

