0%

Freshness

Freshness会进行更严格的对象字面量检查,用来确保对象字面量在结构上类型兼容

结构类型兼容规则:如果两个类型的结构一样,就说它们是互相兼容的,且可以相互赋值的(即如果类型x要兼容类型y,那么类型y至少具有与类型x相同的属性)

Freshness 特性

如上所述,只要满足结构类型兼容规则的两个类型便可相互兼容。那是否有例外存在呢?让我们看下面的例子:

1
2
3
4
5
6
7
8
9
10
11
12
interface Named {
name:string
}
interface Person {
id: number;
name: string;
}
let p: Named;
p = {
id:1,// 不能将类型“{ id: number; name: string; }”分配给类型“Named”。 对象文字可以只指定已知属性,并且“id”不在类型“Named”中。ts(2322)
name: 'Tom',
}

虽然为变量p赋予的字面值完全符合结构类型兼容规则,但它却抛出异常,这主要是由TypeScript中的Freshness特性导致,该特性会对对象字面量进行更为严格的类型检测:只有目标变量的类型与该对象字面量的类型完全一致,对象字面量才可能赋值给目标变量,否则抛出类型错误,我们可以通过类型断言消除异常:

1
2
3
4
5
let p: Named;
p = {
id: 1,
name: 'Tom',
} as Person;