Appearance
类型拓宽
类型拓宽(type widening)是理解 TS 类型推导机制的关键。
一般来说,TS 在推导类型的时候会放宽要求,故意推导出一个更宽泛的类型,而不限定为每个具体的类型。
声明变量时如果运行以后修改变量的值(例如使用let和var声明),变量类型将拓宽,从字面值放大到包含该字面量的基础类型
javascript
let a = "x"; // string
let b = 123; // number
let c = true; //boolean然而,使用const声明不可变的变量时,情况不同,会自动的把类型缩窄:
javascript
const a = "x"; // 'x'
const b = 123; // 123
const c = true; // true我们当然可以显示的标注类型防止类型拓宽
javascript
let a: "x" = "x"; // 'x'
let b: 123 = 123; // 123
let c: true = true; // true不过使用const声明的对象,并不会缩窄推导的类型
typescript
const obj = {
b: 123, // b是number类型
};因为 Javascript 对象是可变的,所以在 Typescript 看来,创建对象之后你可能会更新对象
