Edited at

TypeScriptの変数の末尾の"!"(エクスクラメーション/感嘆符)の意味

More than 1 year has passed since last update.

具体的に言うと、TypeScriptで"foo"という変数に対して"foo!"と記述した時の意味。

この"!"の呼び方は、Non-null assertion operator。

プログラマがコンパイラに対して、この変数はundefinedやnullになることはありません、と教える記述。

不正確だが、型<T>があるとして、型<T | undefined | null>を型<T>に静的にcastしていると考えると分かりやすい。

変換前の型は、型<T | undefined>でも型<T | null>でもOK。

以下、コードによる説明。

    private func(): string {

let foo = external_func(); // 戻り値の型はstring | undefinedとする

// return foo; NG。戻り値の型がstringに対してstring | undefinedを返しているため
return foo!; // OK。"!"によりstring | undefinedをstringにcastしているのと同等
}

なお、この記述はTypeScriptがJavascriptに変換された後のコードからは削除されるとのこと。

なので、コード実行時に違反していても例外などのエラーは発生しない。

上のコードでいえば、コード実行時にfooの値がundefinedやnullでもエラーは発生しない。

(コンパイラから見てfooにundefinedが入ることが明らかだと、コンパイル時にはエラーになる)

より詳細な情報は、以下のページに記述あり。

公式ドキュメント

stack overflow