他们最终意义相同,但前者更可取。在这种情况下:
var drummer: Musician = {
instrument: "drum",
age: 28
}
您正在使用
类型注释声明
drummer
是一个
Musician
,并将对象文字分配给它。编译器很高兴做到这一点,因为它可以验证您分配的对象文字是否与
Musician
接口兼容。对象具有一个字符串类型的
instrument
属性和一个数字类型的
age
属性。
现在我们试试这个:
var drummer: Musician = {};
drummer.instrument = "drum"
drummer.age = 28
将一个空对象文字分配给声明为
Musician
的值会导致编译器错误。毕竟,空对象字面量没有字符串类型的
instrument
属性或数值类型的
age
属性。您正在收到有关此警告。现在,
您 知道下面两行代码将解决这个问题,但编译器不知道。
因此,您可以将其更改为使用
类型断言而不是类型注释:
var drummer = <Musician>{}
drummer.instrument = "drum"
drummer.age = 28
断言是告诉编译器 "这个对象确实是一个音乐家,尽管现在看起来不像"。您需要承担确保
drummer
是一个
Musician
的责任,并解除编译器验证的责任。
并且由于接下来的两行代码添加了所需属性,因此一切都很好。
前者更可取,因为通常情况下希望编译器能够验证类型。类型断言会降低一些安全性,这没关系,直到发生问题就像没有戴安全带驾驶汽车一样。
var drummer = <Musician>{};
drummer.age = 28;
console.log(drummer.instrument.toUpperCase());
有时候您需要使用类型断言。例如,在存在某种循环引用并需要分块构建对象时:
interface MarriedPerson extends Person {
spouse: MarriedPerson
}
var adam: MarriedPerson = {
age: 0,
} as MarriedPerson;
var eve: MarriedPerson = {
age: 0,
spouse: adam
}
adam.spouse = eve;
在上面的代码中,每个
MarriedPerson
都需要引用另一个
MarriedPerson
……但在创建之前不会有这样的对象。因此,你被迫在短时间内让其中一个
MarriedPerson
对象没有必需的
spouse
。因此,需要使用断言。
理解了吗?希望能帮到你,祝好运!