在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
⒈解构数组 最简单的解构莫过于数组的解构赋值了: let input = [1, 2]; let [first, second] = input; console.log(first); // outputs 1 console.log(second); // outputs 2 这创建了2个命名变量 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 ] 当然,由于是JavaScript, 你可以忽略你不关心的尾随元素: let [first] = [1, 2, 3, 4]; console.log(first); // outputs 1 或其它元素: let [, second, , fourth] = [1, 2, 3, 4];
⒉对象解构 你也可以解构对象: let o = { a: "foo", b: 12, c: "bar" }; let { a, b } = o; 这通过 就像数组解构,你可以用没有声明的赋值: ({ a, b } = { a: "baz", b: 101 }); 注意,我们需要用括号将它括起来,因为Javascript通常会将以 你可以在对象里使用 let { a, ...passthrough } = o;
let total = passthrough.b + passthrough.c.length;
⒊属性重命名 你也可以给属性以不同的名字: let { a: newName1, b: newName2 } = o; 这里的语法开始变得混乱。 你可以将 let newName1 = o.a;
let newName2 = o.b;
令人困惑的是,这里的冒号不是指示类型的。 如果你想指定它的类型, 仍然需要在其后写上完整的模式。 let {a, b}: {a: string, b: number} = o; ⒋默认值 默认值可以让你在属性为 undefined 时使用缺省值: function keepWholeObject(wholeObject: { a: string, b?: number }) { let { a, b = 1001 } = wholeObject; } 现在,即使 ⒌解构函数声明 解构也能用于函数声明。 看以下简单的情况: type C = { a: string, b?: number } function f({ a, b }: C): void { // ... } 但是,通常情况下更多的是指定默认值,解构默认值有些棘手。 首先,你需要在默认值之前设置其格式。 其次,你需要知道在解构属性上给予一个默认或可选的属性用来替换主初始化列表。 要知道 function f({ a, b = 0 } = { a: "" }): void { // ... } f({ a: "yes" }); // ok, default b = 0 f(); // ok, default to {a: ""}, which then defaults b = 0 f({}); // error, 'a' is required if you supply an argument 要小心使用解构。 从前面的例子可以看出,就算是最简单的解构表达式也是难以理解的。 尤其当存在深层嵌套解构的时候,就算这时没有堆叠在一起的重命名,默认值和类型注解,也是令人难以理解的。 解构表达式要尽量保持小而简单。 你自己也可以直接使用解构将会生成的赋值表达式。 ⒍展开 展开操作符正与解构相反。 它允许你将一个数组展开为另一个数组,或将一个对象展开为另一个对象。 例如: let first = [1, 2]; let second = [3, 4]; let bothPlus = [0, ...first, ...second, 5]; 这会令 你还可以展开对象: let defaults = { food: "spicy", price: "$$", ambiance: "noisy" };
let search = { ...defaults, food: "rich" };
let defaults = { food: "spicy", price: "$$", ambiance: "noisy" };
let search = { food: "rich", ...defaults };
那么, 对象展开还有其它一些意想不到的限制。 首先,它仅包含对象 自身的可枚举属性。 大体上是说当你展开一个对象实例时,你会丢失其方法: class C { p = 12; m() { } } let c = new C(); let clone = { ...c }; clone.p; // ok clone.m(); // error! 其次,TypeScript编译器不允许展开泛型函数上的类型参数。 这个特性会在TypeScript的未来版本中考虑实现。 |
请发表评论