TS)「?」「!」について

■「?」について

◇オプションパラメーター(?)

◇オプショナルチェイニング(?.)

ネストされたオブジェクトのプロパティが存在するかどうかの条件分岐を簡単に記述できるOptional chaining(?)。

以下のように「?」をプロパティアクセス時に用いることでnullまたはundefinedになりうるオブジェクトに対して安全に処理を記述できます。

interface User {
    name: string
    social?: {
        facebook: boolean
        twitter: boolean
    }
}
let user: User

user = { name:'Takuya', social: {facebook: true, twitter: true}}
console.log(user.social?.facebook);  //true

user = {name: 'Takuya'}
console.log(user.social?.facebook);  //socialが存在しない場合でも実行時エラーにならない

◇Null合体演算子(??)

◇Null合体代入演算子(??=)

■「!」について

◇非nullアサーション演算子(!)

◇明確な割り当てアサーション(!)

コンパイラオプション --strictNullChecks を指定してコンパイルする場合、TypeScriptは通常nullの可能性のあるオブジェクトへのアクセスはエラーとして扱う。nullでないことを示したい時、Non-null-Assertionという機能で、明示的にコンパイラに問題がないことを伝えらえる。Non-nullが示したい変数などに「!」を記述。

//userがnullの場合、実行時エラーになる可能性があるプロパティへのアクセスはコンパイルエラー
//! を用いて明示的に指定することでコンパイルエラーを抑制
function processUser(user?: User){
    let s = user!.name
}