【问题标题】:How to properly use default values for properties on Angular 11 / TS 4?如何正确使用 Angular 11 / TS 4 上的属性的默认值?
【发布时间】:2021-04-17 13:39:01
【问题描述】:

我进行了很多研究,但无法找出 Angular 11/TS4 上的默认属性发生了什么。

例如,在 Angular 10 / TS 3 上,这工作得很好:

export class MyDirective {
    @Input() isRange = false;
}

消费者 TS

isRange?: boolean;

消费者 HTML

<div myDirective [isRange]="isRange"></div>

我能够将isRange 设置为可选属性,它会起作用,这很有意义,因为默认属性确实应该假设对于任何空值,它都会使用其默认值。无论如何,这就是它在其他语言上发生的方式......

但是现在,在迁移到 Angular 11/TS4 之后,相同的代码会产生错误:

错误 TS2322:类型 'boolean | undefined' 不能分配给类型 'boolean'。 类型“未定义”不能分配给类型“布尔”。

9 [isRange]="isRange"

只有在我将输入更改为:

@Input() isRange?= false;

我总是指 angular 11/TS4,因为即使我确实认为这是由 TS 引起的,但在研究时我并不能完全确定。

我的问题是,为什么现在需要 ? 用于具有默认值的属性,最重要的是,它的工作方式是否相同?例如,如果我插入undefined,只需添加?,它会设置默认的false 值吗?

我真的很想有一种方法可以返回到以前的(IMO 正确)行为,而无需停用任何重要的检查,例如 strictTemplateCheck。因为即使项目构建(虽然我不确定这是正确的方法),我现在仍然必须在我的代码中使用很多!,让 TS 知道该属性应该有一个值。

如果您知道它在哪里,请将文档链接添加到您的回答/评论中。

如果有什么不清楚的地方请告诉我。

谢谢!

【问题讨论】:

  • Typescript 设置为严格模式,您传递给输入的变量似乎可能未定义。如果模式设置为严格,Typescript 会检查这一点。
  • @pascalpuetz 是的,但这应该是可以接受的。如果一个属性有一个默认值,它应该接受 undefined。对吗?
  • 不,您还必须明确允许 undefined 被传递。在严格模式下,booleanboolean | undefined 是不同的类型,boolean 不能是 undefined,除非明确允许。这是为了减少 Property 'x' is not present on 'undefined' 问题之类的错误 - 因为在严格模式下,您必须明确检查这一点。这与 Angular 仍然分配默认值这一事实不同——Typescript 不知道这一点,这就是为什么你必须添加 bang 运算符!,它有效地告诉 TS“我知道这永远不会未定义”。跨度>

标签: angular typescript angular11 typescript4.0


【解决方案1】:

这种行为是在 TS v4 https://www.typescriptlang.org/docs/handbook/release-notes/typescript-4-0.html#class-property-inference-from-constructors 中引入的

如果您确定 undefined 值处理得当,?! 都可以

【讨论】:

  • 感谢您的回答和链接!不过,还有一个悬而未决的问题。您提供的链接并没有告诉我isRange?=false 在我做[isRange]=undefined 时是否会默认使用false。从中我可以阅读有关类型推断的信息,但不能阅读默认值。再次感谢。
  • [isRange]=undefined 会将false 作为默认值,Typescript 不会更改旧的行为而不提及它,这个新的更改只是类型安全措施
  • 酷,谢谢。我只是希望我可以恢复不使用?,这迫使我在组件中使用!……希望这也困扰着其他人,他们会提供替代方案。再次感谢。
猜你喜欢
  • 2011-12-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-04-08
  • 1970-01-01
  • 2011-10-10
  • 1970-01-01
相关资源
最近更新 更多