【问题标题】:Angular @input property ending with exclamation point?Angular @input 属性以感叹号结尾?
【发布时间】:2019-11-28 17:32:33
【问题描述】:

source code 具有以! 结尾的@Input 属性。这是一个例子:

@Input() token!:StripeToken

为什么在这种情况下使用! 很有用?一些 cmets 已经注意到它是一个非 null 断言运算符,但为什么在这种特定情况下拥有它是有用的(或者可能没用)?

我认为这个问题的答案是,对于 Angular @Input 属性在属性末尾具有非 null 断言的属性永远不会有意义,但我想看看你们其他人是怎么想的?

更新

我在一个新的 Angular 项目上尝试过,但出现了这个错误:

一个明确的赋值断言'!'在这种情况下是不允许的。ts(1255)

所以我认为在@Input 属性上包含! 运算符是没有意义的。截图如下:

【问题讨论】:

  • 是的 - 好多了 - 谢谢!
  • 不太确定为什么我们会在 Angular 上下文中使用它?为什么在 Angular @Input 字段上使用它?
  • 在手册场景中它非常有意义,但我仍然不确定他们为什么将其添加到 @Input 字段中。 Angular 中的用例总是假设这些不为空,并且我们没有收到任何编译错误?

标签: javascript angular typescript ecmascript-6


【解决方案1】:

它们使用编译器选项 strictPropertyInitialization,因此任何未使用类型 undefined 声明且未直接初始化或在构造函数中初始化的类属性都会产生错误 TS2564。

为了防止这个编译器错误,他们使用definite assignment assertion modifier 告诉 TypeScript

...确实为所有意图和目的分配了一个变量, 即使 TypeScript 的分析无法检测到这一点。

Demo

延伸阅读:https://mariusschulz.com/blog/strict-property-initialization-in-typescript#solution-4-definite-assignment-assertion

关于您的更新

您在示例中没有为 title 变量指定类型,这就是您收到错误 TS1255 的原因。在这种情况下使用! 是可能的并且是有意义的!

【讨论】:

  • 那么在这种情况下使用它是否有意义,因为它不是构造函数中包含的参数,它也是由createToken 方法创建和设置的东西,所以对我来说这似乎几乎与代码想要做的相反?
  • @Input 属性的值通常从父组件传递给组件。由于编译器不知道这种情况正在发生,并且该属性没有以编译器已知的任何其他方式初始化,它会根据strictPropertyInitialization 选项引发错误。所以他们必须告诉编译器不要关心初始化时未定义的属性。他们本可以使用@Input() token: StripeToken | undefined 来允许未定义的值,或者使用! 来不检查未定义的值。他们决定稍后再做。
  • 这是有道理的——但是如果你在主页上查看他们的使用示例:github.com/AckerApple/stripe-angular 事实证明他们没有在组件上设置令牌,因为令牌是由 Stripe 创建的API,所以我认为他们可能误解了该运算符的用途......我也不认为 Angular / Typescript 对它有任何作用......它在 Angular 场景中是否存在并不重要......会你同意吗?
  • 我在一个新的 Angular 项目上对其进行了测试,但它甚至不允许这样做——所以这似乎不是我们在 Angular 项目中想要做的事情。
  • 我用一个类型再次测试了这个,但没有初始化元素上的属性,Angular 不会抛出编译器错误......
猜你喜欢
  • 2018-02-08
  • 1970-01-01
  • 1970-01-01
  • 2021-01-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-01-27
  • 2012-03-06
相关资源
最近更新 更多