解构数组
最简单的解构莫过于数组的解构赋值了:
let input = [1, 2]; let [first, second] = input; console.log(first); // outputs 1 console.log(second); // outputs 2
这创建了2个命名变量 first
和 second
。 相当于使用了索引,但更为方便:
first = input[0]; second = input[1];
解构作用于已声明的变量会更好:
// swap variables [first, second] = [second, first];
作用于函数参数:
function f([first, second]: [number, number]) { console.log(first); console.log(second); } f(input);
你可以在数组里使用...
语法创建剩余变量:
let [first, ...rest] = [1, 2, 3, 4]; console.log(first); // outputs 1 console.log(rest); // outputs [ 2, 3, 4 ]
对象解构
你也可以解构对象:
let o = { a: "foo", b: 12, c: "bar" }; let { a, b } = o;
这通过 o.a
and o.b
创建了 a
和 b
。 注意,如果你不需要 c
你可以忽略它。
就像数组解构,你可以用没有声明的赋值:
({ a, b } = { a: "baz", b: 101 });
你可以在对象里使用...
语法创建剩余变量:
let { a, ...passthrough } = o; let total = passthrough.b + passthrough.c.length;
属性重命名
你也可以给属性以不同的名字
let { a: newName1, b: newName2 } = o;
这里的语法开始变得混乱。 你可以将 a: newName1
读做 "a
作为 newName1
"。 方向是从左到右,好像你写成了以下样子:
let newName1 = o.a; let newName2 = o.b;
默认值
默认值可以让你在属性为 undefined 时使用缺省值:
function keepWholeObject(wholeObject: { a: string, b?: number }) { let { a, b = 1001 } = wholeObject; }
现在,即使 b
为 undefined , keepWholeObject
函数的变量 wholeObject
的属性 a
和 b
都会有值。
函数声明
解构也能用于函数声明。 看以下简单的情况:
type C = { a: string, b?: number } function f({ a, b }: C): void { // ... }
展开
展开操作符正与解构相反。 它允许你将一个数组展开为另一个数组,或将一个对象展开为另一个对象。 例如:
let first = [1, 2]; let second = [3, 4]; let bothPlus = [0, ...first, ...second, 5];
这会令bothPlus
的值为[0, 1, 2, 3, 4, 5]
。 展开操作创建了 first
和second
的一份浅拷贝。 它们不会被展开操作所改变。
你还可以展开对象:
let defaults = { food: "spicy", price: "$$", ambiance: "noisy" }; let search = { ...defaults, food: "rich" };