このシリーズの概要
これまで、業務やプライベートで Typescript を書いてきました👇 (例) しかし
なんとなく書いてきたので、キチンと理解する目的で書こうと思い、気になる単位ごとにまとめてアウトプットしようと思いました。
今回書くのは「型アサーション」についてです。
型アサーションについて
TypeScriptには型の指定の方法が様々ありますが、今回は型アサーション(Type Assertion)について書いていきます。
型アサーションとは、推論された型や、既に型定義済みの変数の型を上書きします。別の型を定義できてしまうのですね。。
なんでも上書きできるわけではなくて、型の互換性があることが前提です。
実際に見てみましょう。
const data = {} // 空のオブジェクトだと型推論される
data.foo = 1 // エラーが起こる
勝手に型推論されて、代入ができなくて困るシーンがあったなら、型アサーション(Type Assertion)を用いるチャンスです。
interface testType {
foo: number;
}
const data = {} as testType;
data.foo = 1;
これでコンパイルエラーは出なくなります。
左辺(この場合はdata
)に型アノテーションするのではなく、右辺{}
に対して型アノテーションする方法もあるのですね。
型アサーションを使う際に注意すること
型アサーションは便利ですが、型推論を書き換えてしまいます。そうなると、エラーを起こしそうな記述をしてもコンパイラが指摘してくれない可能性があり、ランタイムエラーを起こす可能性があります。
例えば
interface testType {
foo: number;
}
const data: testType = {} // Property 'foo' is missing in type '{}' but required in type 'testType'.
プロパティfoo
の追加忘れているよ。という指摘をしてくれます。
しかし、型アサーションの場合は指摘をしてくれません。
interface testType {
foo: number;
}
const data = {} as testType;
ランタイムエラーを起こす可能性を感じませんか?
なので、一時的な使用に限った方が良さそうだなと感じました。
もし、型アサーションの有効性を感じられるケースが分かれば加筆したいと思います!
読者の方でいい例をご存知の方がいらっしゃれば、ぜひ教えてください!
以上です。
参考
アウトプット100本ノック実施中