110
Help us understand the problem. What are the problem?

More than 3 years have passed since last update.

posted at

updated at

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

具体的に言うと、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

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Sign upLogin
110
Help us understand the problem. What are the problem?