【问题标题】:!: (bang colon) notation in Angular!: Angular 中的(爆炸冒号)符号
【发布时间】:2020-01-24 04:43:17
【问题描述】:

我发现Angular Deprecation docs 中使用了!: 表示法。

@Input() tpl !: TemplateRef<any>;
@ContentChild(TemplateRef) inlineTemplate !: TemplateRef<any>;

找到相同的here as well

@Input() id !: string;

我不确定 Angular 中 !: 符号的术语(或背后的概念)是什么。谷歌搜索对我没有多大帮助。尝试了 SymbolHound 和 Angular Docs,但都是徒劳的。

如果有人能解释一下它会很有帮助,比如它是如何工作的,或者至少分享文档链接。

【问题讨论】:

    标签: angular typescript


    【解决方案1】:

    如果你有strictNullChecks,那么你用@Input 装饰的任何东西通常都会抱怨。比如……

    public class MyComponent {
    
      @Input()
      public myField: string;
    
      constructor() {}
    
    }
    

    这会导致 TS 抱怨。这是因为myField 没有被声明为可以为空,所以它不应该被设置为nullundefined。同时在构造函数中没有初始化,所以会得到一个初始值undefined

    通常,这很好。我们知道 Angular 会在构建后不久设置该值。如果我们将字段标记为可空public myField: string?,那么当我们尝试使用它时,我们将不得不处理所有地方的this field may be null 错误。

    因此,作为一种折衷方案,我们在字段声明中抛出 ! 以告诉 Typescript“我知道这看起来像是被初始化为 null/undefined 但相信我,我会处理好它”。

    【讨论】:

    • 明白了!很高兴你回答了解释。对未来的读者会有帮助
    【解决方案2】:

    感叹号! 表示,该字段是非空非未定义(参见Microsoft's TypeScript documentation)。

    冒号: 只是字段名称和类型之间的分隔符。

    【讨论】:

    • 哦,所以它更像是 Typescript 的一个功能,通常与 Angular 无关
    • 我已经多次使用something!.property,但从未使用过something !: string。现在这个问题本身感觉很愚蠢。无论如何感谢您的及时回复。为你投票,但接受的勾号转给 Pace 进行解释 :)
    猜你喜欢
    • 2019-02-06
    • 2019-08-31
    • 1970-01-01
    • 2020-02-21
    • 2014-06-10
    • 2016-12-04
    • 2015-01-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多