メインコンテンツまでスキップ

Effective TypeScript

1. TS と JS の関係

  • TS は JS のスーパーセット。JS のコードは TS のコードとして使える。
  • TS は静的型付けにより、ランタイムエラーを事前に検出することを目的としている。
  • 型チェックをパスしてもランタイムエラーは起きうる
  • 引数の数が違うなどの明らかにおかしい構文は、JS ではチェックされないけど TS ではチェックされるものがある
  • 型注釈は、開発者の意図を明示し、コンパイラが正解と不正解を見分けやすくするために使うもの

2. TypeScript のオプション

  • TS はオプション設定で劇的に動作が変わる
  • JS からの移行プロジェクトを除き、noImplicitAnyは必ずオン
  • strictNullChecksundefined is not an objectのエラーをなくすために大事
  • strictはそれら厳しめの設定の盛り合わせであり、オンを推奨
  • strictよりも厳格なnoUncheckedIndexedAccessのようなオプションもあるので適宜選択する

3. コード生成と型は独立している

インターフェース、型、型注釈はトランスパイル時に全て削除される。 このためランタイム時にinstanceof SomeTypeみないなことはできない。 ランタイム時の判定には「タグ付きユニオン」などを使う。

ややこしいことに、class のように型と値を両方生成するものもある。

class Foo {}
class Bar {}
// 型として利用
type FooOrBar = Foo | Bar
// 値として利用
if (a instanceof Foo) {
}

型エラーはあってもトランスパイルはできる。 少々型エラーがあっても動かせた方が開発時には便利だよね。 noEmitOnErrorを使うと、型エラーがあるとトランスパイルしないようにできるけど。