在阅读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有效。我们都知道。因此我必须遗漏一些东西。祈祷,解决这个杀手谜......
答案 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