TypeScript でみかけた ! マークについて調べてみた。

Non-Null Assertion Operator

非nullアサーション演算子(Non-Null Assertion Operator) について。

新しい!ポストフィックス式演算子を使用して、型チェッカーが結論付けられないコンテキストにおいて、そのオペランドが非nullでかつ非undefinedであることをアサートすることができます。

strictNullChecks - TypeScript Deep Dive 日本語版

// Compiled with --strictNullChecks
function validateEntity(e?: Entity) {
    // Throw exception if e is null or invalid entity
}
function processEntity(e?: Entity) {
    validateEntity(e);
    let a = e.name;  // TS ERROR: e may be null.
    let b = e!.name;  // OKAY. We are asserting that e is non-null.
}

Definite Assignment Assertion Operator)

class C {
  foo: number; // OKAY as assigned in constructor
  bar: string = "hello"; // OKAY as has property initializer
  baz: boolean; // TS ERROR: Property 'baz' has no initializer and is not assigned directly in the constructor.
  constructor() {
    this.foo = 42;
  }
}

プロパティ名に後置された完全な代入アサーションを使用して、コンストラクタ以外の場所で初期化することをTypeScriptに通知することができます。

class C {
  foo!: number;
  // ^
  // Notice this exclamation point!
  // This is the "definite assignment assertion" modifier.
  constructor() {
    this.initialize();
  }
  initialize() {
    this.foo = 0;
  }
}