TL;DR
- TypeScript には 100 を超えるコンパイラオプションがあり、少なくとも
noImplicitAnyとstrictNullChecksは把握しておく必要がある。 - どちらもプロジェクトが大きくなるほど有効にしにくくなるので、できるだけ早く有効にする。
内容
noImplicitAny
noImplicitAny は、暗黙の any を許すかどうかを指定する。暗黙の any とは、any と書いていないのに、型が any(型が不明)と推論されることである。TypeScript は型情報があるときに最もよく機能するので、基本的には true にする。
false にしてよいのは、JavaScript から TypeScript へ移行している最中だけである。その場合も、できるだけ早く true にする。
strictNullChecks
strictNullChecks は、null と undefined をすべての型の値として許すかどうかを指定する。有効にすると、undefined is not an object のような null や undefined が絡むエラーを捕捉しやすくなる。
一方で、TypeScript を書く難しさも上がる。そのため、TypeScript の初学者がいるチームでは false にする選択もある(優先度は noImplicitAny のほうが高い)。ただし、プロジェクトが大きくなるほど有効にしにくくなるので、できるだけ早く有効にしたほうがよい。
strict とそれより厳しいオプション
strict を true にすると、上の 2 つを含む次のオプションをまとめて有効にできる。tsc --init で生成した設定では、strict: true になっている。
alwaysStrictstrictBindCallApplystrictBuiltinIteratorReturnstrictFunctionTypesstrictPropertyInitializationnoImplicitThisuseUnknownInCatchVariables
strict より厳しいオプションもある。たとえば noUncheckedIndexedAccess を有効にすると、インデックスシグネチャのプロパティや配列の要素を参照するときに、undefined のチェックが必須になる。次のコードはエラーになる。
const tenses = ["past", "present", "future"]
tenses[3].toUpperCase() // エラーただし、範囲内の有効なアクセスにもチェックが必要になるので、tenses[0].toUpperCase() もエラーになる。
キーワード
- tsconfig.json
- any 型
- インデックスシグネチャ