angular - Typescript 自定义接口变量声明
问题描述
TypeScript 新手在这里,我目前正在这里学习 TutorialsPoint的语言。我目前很难理解这两段代码之间的区别。
interface Person{
age: number;
}
interface Musician extends Person{
instrument: string;
}
var drummer:Musician = {
instrument: "drum",
age: 28
}
和
interface Person{
age: number;
}
interface Musician extends Person{
instrument: string;
}
var drummer = <Musician>{}
drummer.instrument = "drum"
drummer.age = 28
两者有什么区别?是否存在使用第一个/第二个实现更好的特定情况?
谢谢你。
解决方案
它们最终等同于同一件事,但如果可能,前者是首选。
在这种情况下:
var drummer: Musician = {
instrument: "drum",
age: 28
}
您通过使用类型注释drummer
来声明它,并为其分配一个对象文字。编译器对此很满意,因为它可以验证是的,您分配的对象文字与接口兼容。它有一个字符串值属性和一个数值属性。 Musician
Musician
instrument
age
现在如果我们试试这个:
var drummer: Musician = {};
// ~~~~~~~ <-- error!
// Type '{}' is not assignable to type 'Musician'.
// Property 'instrument' is missing in type '{}'.
drummer.instrument = "drum"
drummer.age = 28
将空对象文字分配给声明为 a 的值Musician
会导致编译器错误。毕竟,空对象文字没有字符串值instrument
属性或数值age
属性。你被警告了。现在,您知道接下来的两行将解决该问题,但编译器没有。
因此,您可以将其更改为使用类型断言而不是类型注释:
var drummer = <Musician>{}; // okay
drummer.instrument = "drum"
drummer.age = 28
断言是你告诉编译器“这个对象实际上是一个Musician
,即使现在它看起来不像它。” 您负责确保这drummer
是 aMusician
并减轻编译器为您验证的责任。
而且由于接下来的两行添加了所需的属性,所以一切都很好。
前者更可取,因为您通常希望编译器能够验证您的类型。类型断言放弃了一些安全性,这很好,直到它不是,就像在没有安全带的情况下驾驶汽车:
var drummer = <Musician>{}; // okay
drummer.age = 28;
// whoops, forgot the instrument, but TypeScript isn't complaining
// ... later ...
console.log(drummer.instrument.toUpperCase());
// no error at compile time
// but blows up at runtime
有时您必须使用类型断言。例如,当您有某种循环引用需要分段构建对象时:
interface MarriedPerson extends Person {
spouse: MarriedPerson
}
var adam: MarriedPerson = {
age: 0,
// spouse: eve <-- can't do this before eve is defined
} as MarriedPerson;
var eve: MarriedPerson = {
age: 0,
spouse: adam
}
adam.spouse = eve; // okay now
在上面,每个都MarriedPerson
需要一个对MarriedPerson
... 的引用,但在你创建一个之前不会有一个。MarriedPerson
因此,您不得不求助于其中一个对象没有所需的短时间内spouse
。因此需要断言。
那有意义吗?希望能帮助到你; 祝你好运!
推荐阅读
- macos - 无法从钥匙串访问导出 .p12
- c++ - 如何在 Vulkan 中渲染纹理?
- animation - Flutter:显示用户点击的位置
- python - GEE Python API:显示图像失败
- c# - 更新游戏视图窗口的 GUI(Unity 编辑器)时是否调用了公共委托?
- node.js - 创建反应应用程序后,Npm start 不起作用
- python - 嵌套结构比较
- python - 在 plotly 条形图中绘制分组的 pandas 数据
- python-3.x - 如何将 API 数据保存到 pandas DataFrame 中?
- javascript - 如何在 JavaScript 中获得具有给定替换的字符串的所有组合?