TypeScript 变量声明


作者:Seiya

时间:2019年08月01日


const 声明


它与 let 声明相似,但是就像它的名字所表达的,它们被赋值后不能再改变。换句话说,它们拥有与 let 相同的作用域规则,但是不能对它们重新赋值。

除非你使用特殊的方法去避免,实际上 const 变量的内部状态是可修改的。 幸运的是,TypeScript 允许你将对象的成员设置成只读的。



let vs. const


使用最小特权原则,所有变量除了你计划去修改的都应该使用 const。基本原则就是如果一个变量不需要对它写入,那么其它使用这些代码的人也不能够写入它们,并且要思考为什么会需要对这些变量重新赋值。使用const也可以让我们更容易的推测数据的流动。



解构


解构数组

let input = [1, 2];
let [first, second] = input;
console.log(first); // outputs 1
console.log(second); // outputs 2

解构作用于已声明的变量会更好:

// swap variables
[first, second] = [second, first];

你可以在数组里使用 ... 语法创建剩余变量:

let [first, ...rest] = [1, 2, 3, 4];
console.log(first); // outputs 1
console.log(rest); // outputs [ 2, 3, 4 ]

或其它元素:

let [, second, , fourth] = [1, 2, 3, 4];


解构对象

let o = {
	a: "foo",
	b: 12,
	c: "bar"
};
let { a, b } = o;


属性重命名

可以给属性以不同的名字:

let { a: newName1, b: newName2 } = o;

这里的冒号不是指示类型的。 如果你想指定它的类型, 仍然需要在其后写上完整的模式:

let {a, b}: {a: string, b: number} = o;


函数声明

解构也能用于函数声明。 看以下简单的情况:

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];

展开操作创建了 first 和 second 的一份浅拷贝。 它们不会被展开操作所改变。你还可以展开对象:

let defaults = { food: "spicy", price: "$$", ambiance: "noisy" };
let search = { ...defaults, food: "rich" };

tips

对象的展开比数组的展开要复杂的多。 像数组展开一样,它是从左至右进行处理,但结果仍为对象。 这就意味着出现在展开对象后面的属性会覆盖前面的属性。


对象展开还有其它一些意想不到的限制。 首先,它仅包含对象 自身的可枚举属性。 大体上是说当你展开一个对象实例时,你会丢失其方法:

class C {
  p = 12;
  m(){}
}
let c = new C();
let clone = { ...c };
clone.p; // ok
clone.m(); // error!
最后更新时间: 2019-8-1 11:06:53