Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
79
Help us understand the problem. What is going on with this article?
@zigenin

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

79
Help us understand the problem. What is going on with this article?
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
zigenin

Comments

No comments
Sign up for free and join this conversation.
Sign Up
If you already have a Qiita account Login
79
Help us understand the problem. What is going on with this article?