Angular:未知' null!'句法

时间:2018-05-24 19:03:33

标签: javascript angular typescript

在阅读Angular 2源代码时,我遇到了NgForOfContext<T>哪些来源可以在官方存储库here中找到,而在这里可以找到引起兴趣的部分。

特别是以下语法是我从未在普通Javascript和Typescript中看到过的东西:

private _applyChanges(changes: IterableChanges<T>) {
    const insertTuples: RecordViewTuple<T>[] = [];
    changes.forEachOperation(
        (item: IterableChangeRecord<any>, adjustedPreviousIndex: number, currentIndex: number) => {
          if (item.previousIndex == null) {
            const view = this._viewContainer.createEmbeddedView(
                this._template, new NgForOfContext<T>(null !, this.ngForOf, -1, -1), currentIndex);
            const tuple = new RecordViewTuple<T>(item, view);
            insertTuples.push(tuple);
          } else if (currentIndex == null) {
            this._viewContainer.remove(adjustedPreviousIndex);
          } else {
            const view = this._viewContainer.get(adjustedPreviousIndex) !;
            this._viewContainer.move(view, currentIndex);
            const tuple = new RecordViewTuple(item, <EmbeddedViewRef<NgForOfContext<T>>>view);
            insertTuples.push(tuple);
          }
        });

我在谈论null !在线:

this._template, new NgForOfContext<T>(null !, this.ngForOf, -1, -1), currentIndex);

第一个参数为null,后跟logical not(!)。在我理解这段代码的过程中,我进行了双重检查,据我所知,null是一个原始的Javascript(和TS)类型,没有{{{} 1}}。此外,如果null !(非空)返回!null

,那么会产生更多的语法意义

为了确保我错了,我试图编译它,但令我惊讶的是,它失败了。它抱怨意外)

现在,显然Angular有效。我们都知道。因此我必须遗漏一些东西。祈祷,解决这个杀手谜......

1 个答案:

答案 0 :(得分:3)

这称为Non-null assertion operator,当我们有一个可以为null的值来声明它不为空时使用它

  var nullable: string | null = null;
  var nonNullable: string = "";

  nonNullable = nullable // Error 
  nonNullable = nullable! // Ok, we asserted it is not null

在这种情况下,使用它(相当反直觉)断言null不为空

nonNullable = null! // Ok, we assert null is not null 

游乐场link