Effective TypeScript
1. TS と JS の関係
- TS は JS のスーパーセット。JS のコードは TS のコードとして使える。
- TS は静的型付けにより、ランタイムエラーを事前に検出することを目的としている。
- 型チェックをパスしてもランタイムエラーは起きうる
- 引数の数が違うなどの明らかにおかしい構文は、JS ではチェックされないけど TS ではチェックされるものがある
- 型注釈は、開発者の意図を明示し、コンパイラが正解と不正解を見分けやすくするために使うもの
2. TypeScript のオプション
- TS はオプション設定で劇的に動作が変わる
- JS からの移行プロジェクトを除き、
noImplicitAny
は必ずオン strictNullChecks
もundefined is not an object
のエラーをなくすために大事strict
はそれら厳しめの設定の盛り合わせであり、オンを推奨strict
よりも厳格なnoUncheckedIndexedAccess
のようなオプションもあるので適宜選択する
3. コード生成と型は独立している
インターフェース、型、型注釈はトランスパイル時に全て削除される。
このためランタイム時にinstanceof SomeType
みないなことはできない。
ランタイム時の判定には「タグ付きユニオン」などを使う。
ややこしいことに、class のように型と値を両方生成するものもある。
class Foo {}
class Bar {}
// 型として利用
type FooOrBar = Foo | Bar
// 値として利用
if (a instanceof Foo) {
}
型エラーはあってもトランスパイルはできる。
少々型エラーがあっても動かせた方が開発時には便利だよね。
noEmitOnError
を使うと、型エラーがあるとトランスパイルしないようにできるけど。