你想系统掌握 TypeScript 里的 …rest(剩余运算符),包括它的语法、类型约束、所有使用场景、与展开运算符的区别和避坑点,这份总结会覆盖 rest 的全部核心用法 + TS 专属技巧,内容完整且实用,学完就能直接落地。
✅ 一、基础认知:什么是 rest 剩余运算符(…)
1. 核心定义
…变量名 就是剩余运算符(Rest Operator),核心作用是:将「多个零散的元素 / 参数」收集并聚合为一个「数组 / 元组 / 对象」,本质是「聚合 / 收集」。
2. 关键前置:rest ≠ 展开(spread),分清「聚合」vs「打散」
很多人会把 … 搞混,核心区别一句话分清,这是最基础也最重要的点:
- 剩余运算符(Rest):…变量名 → 聚合 / 收集:把「多个独立内容」变成「一个集合(数组 / 对象)」,是「多 → 一」的过程;
- 展开运算符(Spread):…集合 → 打散 / 平铺:把「一个集合(数组 / 对象)」变成「多个独立内容」,是「一 → 多」的过程;
语法区分技巧:… 后面跟「变量名」就是 rest,… 后面跟「具体的集合(数组 / 对象)」就是 spread。
ts
// rest 剩余:聚合,多→一
const [a, …restArr] = [1,2,3,4]; // restArr = [2,3,4]
// spread 展开:打散,一→多
const newArr = [0, …restArr]; // newArr = [0,2,3,4]
✅ 二、场景一:函数中的剩余参数(最常用,TS 核心重点)
2.1 基础用法:函数形参的 rest
当函数需要接收不确定数量的参数、任意数量的参数时,用 …rest 定义剩余参数,它会把「函数调用时传入的、未被形参匹配的参数」全部收集为一个数组。
ts
// 语法:函数形参中,…rest放在最后
function sum(base: number, …nums: number[]) {
return base + nums.reduce((a, b) => a + b, 0);
}
sum(10, 1, 2); // 13 → nums = [1,2]
sum(10, 1, 2, 3, 4); // 20 → nums = [1,2,3,4]
2.2 TS 类型约束(必掌握)
函数的剩余参数 必须显式指定类型,且类型只能是「数组类型」,常见 2 种写法,完全等价:
ts
// ✅ 写法1:推荐,简洁直观,最常用
function fn1(…args: string[]) {}
// ✅ 写法2:元组语法,等价于数组,适合强调「有序集合」
function fn2(…args: Array<string>) {}



