【问题标题】:Why does TypeScript not complain about properties not included in the state when casting?为什么 TypeScript 在强制转换时不会抱怨状态中未包含的属性?
【发布时间】:2019-11-09 10:50:06
【问题描述】:

为什么 TypeScript 的行为方式与我的情况一样?

如果我直接键入一个对象,它会抱怨接口中未定义的属性。但是,如果我投射对象,它允许添加任何未在界面中定义的随机属性。

最好用一个例子来解释:

interface House {
  windows: number;
  garden: boolean;
}

const house1: House = {
  windows: 5,
  garden: true,
  garage: true // not allowed
};

const whatever = {
  house2: <House> {
    windows: 3,
    garden: true,
    garage: true // why is it here allowed?
  }
};

【问题讨论】:

标签: typescript


【解决方案1】:

之所以有效,是因为它是Type Assertion。基本上告诉编译器它是什么类型但不保护它,例如

const house1 = <House> {
  windows: 5,
  garden: true,
  garage: true // allowed
};

基本上你告诉 ts 编译器不要对数据进行特殊检查或重组。

您可以使用适当的类型为属性键入保护它,例如

const whatever: { house2: House } = {
    house2: {
        windows: 3,
        garden: true,
        garage: true // not allowed
    }
};

【讨论】:

  • 能否更清楚地区分“类型转换”和“类型断言”?
  • @k0pernikus 没有“类型转换”,两个术语之间没有太大区别。 Typescript 将其称为“类型断言”,因为它听起来更像是语言框架。除此之外,“强制转换”意味着其他语言可能支持运行时,但在 Typescript 中,它纯粹是在编译时。
  • 好的,有没有办法转换它,它不仅告诉编译器它是什么类型,而且还保护它?
  • @mnewmedia 已添加。
  • 好的,知道了。但是由于在现实生活中的应用程序中,house2 被一个数组中的对象(无论什么)包裹。有时它与房子的类型不同。所以它的行为方式使得它现在比它可能的复杂得多。
猜你喜欢
  • 2012-05-21
  • 2011-02-08
  • 2020-11-30
  • 2021-07-02
  • 1970-01-01
  • 2017-05-20
  • 2012-07-09
  • 2016-10-30
相关资源
最近更新 更多