TypeScript 中的扩展运算符(Spread Operator)是三个点 `...`,它源于 JavaScript ES6,用于将可迭代对象(如数组、字符串)展开为独立元素,或将对象的可枚举属性展开到新对象中 。
核心用法
- 数组展开:合并数组、复制数组(浅拷贝)或作为函数参数传递。
```typescript
const arr1 = 1, 2;
const arr2 = ...arr1, 3; // 1, 2, 3
Math.max(...1, 2, 3); // 替代 apply 方法
```
- 对象展开:合并对象、复制对象(浅拷贝)或覆盖特定属性。
```typescript
const obj1 = { a: 1 };
const obj2 = { ...obj1, b: 2 }; // { a: 1, b: 2 }
const updated = { ...obj2, a: 10 }; // { a: 10, b: 2 },覆盖原属性
```
- 元组扩展:在元组类型中展开数组类型,定义不定长度成员。
```typescript
type T = string, ...number\[]; // 第一个是 string,后面是任意个 number
```
关键特性与注意
-
浅拷贝:仅拷贝第一层属性,嵌套对象仍为引用关系,修改嵌套数据会影响原数据 。
-
类型推断:TypeScript 能自动推断展开后的类型。对象展开时,新对象类型通常为原类型与新属性的交叉类型(`typeof obj & { newProp: Type }`),允许添加原接口未定义的新属性而不报错 。
-
与剩余参数区别:`...` 在函数定义参数位置时称为剩余参数(Rest Parameters),作用是收集多个参数为一个数组,与扩展运算符互为逆运算 。