Typescriptの型の扱いのメモ

Typescriptの型関連の演算子、?とか!とかググらビリティがあまりよくないので、ちょっとメモしておく。

Type Assertion

asは型アノテーション。キャストと違うのはコンパイラ向けの情報のみで、それ自体は実行環境に影響を与えないことが違いのよう。

アノテーションでは、無理やり型を変える危険な処理であることを理解しておく必要がある。 ダイヤモンド演算子を使ったcastもあるらしいが、JSX/TSXが出てきたので、asが推奨されている。

typeof

typeofは組み込み型(numberとかstringとか)のTypeguard。

instanceof

instanceof はクラスの判定に利用する。

Optional Parameters / ?

引数やクラスフィールドにおいて、Optionalであることを示す。

function task(a: number, b?: number) {
}

bは引数に指定してもしなくてもよいことを示す。型としては number | undefinedとして解釈される。

ローカル変数などの宣言においては利用できない。

let a?: number; // NG
let a: number | undefined; // OK

Optional chaining

Optionalな変数はifなどでチェックするほかに、変数や変数を取得する関数のあとに?を付けてメソッドチェインすれば、undefinedやnullの場合でも短絡してundefinedを返すようになる。

    function task(a?: number | null) {
      const b = a?.toString().substr(0, 1); // undefined
      const c = task2(a)?.toString(); // undefined
    }

    function task2(a?: number | null): number | null {
      return null;
    }

Non-null assertion operator

nullやundefinedでないことを保証できるなら、?ではなく!を付ければよい。これでnullチェックやundefチェックが入らなくなる。 つまり、nullやundefinedが入力されていると、実行時エラーが発生するということである。 安全ではなくなるので、利用する場合には注意が必要である。

    function task(a?: number | null) {
      const a = a!.toString(); // aがnullの場合は実行エラーが起きる
    }

ほかにも出てきたら追記する。