You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.03 00:09:02