...args 是 ES6 引入的剩余参数语法,用于收集函数中多余实参为真数组,必须位于形参末尾;TypeScript 中需标注类型如 ...args: number[],不支持 T...args 写法。

T...args 这种写法在 JavaScript 或 TypeScript 中并不存在,可能是混淆了语法。真正用于接收任意数量参数的是 剩余参数(Rest Parameters),写法是 ...args(三个点 + 参数名),前面没有类型 T。如果你用的是 TypeScript,可以结合类型标注来约束参数类型。
什么是 ...args?
它是 ES6 引入的语法,允许函数接收不定数量的实参,并将它们收集为一个数组:
- 必须放在形参列表的最后位置
- 只能有一个剩余参数
- 实际传入的多余参数会自动变成一个真数组(不是类数组)
TypeScript 中如何给 ...args 加类型?
你可以明确指定 args 的类型,比如全是字符串、全是数字,或联合类型:
function logAll(...args: string[]) { /* 所有参数必须是 string */ }
function sum(...numbers: number[]) { /* 全是 number */ }
function flexible(...args: (string | number)[]) { /* 混合类型 */ }如果想更灵活,还能用泛型配合 rest 参数(TypeScript 3.0+):
function tuple<T extends any[]>(...args: T): T {
return args;
}
const result = tuple('hello', 42, true); // 类型推导为 [string, number, boolean]常见错误和注意事项
- 不能写成
T...args—— TypeScript 不支持这种“类型前缀 + rest”的写法 - 不要和 arguments 对象混用:rest 参数是真正的数组,arguments 是类数组且已被废弃
- 解构时不能直接对 ...args 做解构赋值(如
const [first, ...rest] = args是合法的,但前提是 args 已存在)
实用小技巧:转发参数
常用于高阶函数或封装调用:
function delayCall(fn: (...args: any[]) => void, ms: number, ...args: any[]) {
setTimeout(() => fn(...args), ms);
}
delayCall(console.log, 1000, 'a', 'b', 'c'); // 1秒后输出 a b c

















