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!