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の場合は実行エラーが起きる }
ほかにも出てきたら追記する。