環境
- TypeScript 4.2.3
該当のコードはTypeScript Playgroundにあります。
TypeScriptでは、配列のインデックスアクセス時の型推論にundefinedが含まれない
下記のコードはnumber
型の変数にundefined
を代入していますが、TypeScriptのデフォルトの設定だとコンパイルエラーになりません。
const undefinedable = [1,2,3][4];
const numberOnly: number = undefinedable;
console.log(numberOnly); //=> undefined
これはconst undefinedable = [1,2,3][4]
がnumber | undefined
ではなくnumber
のみで型推論されるためです。
tsconfigでstrict: true
やstrictNullChecks: true
の設定を使っても変わりません。ですがTypeScript4.1で追加されたnoUncheckedIndexedAccessというオプションを使うと、const undefinedable = [1,2,3][4]
がnumber | undefined
に型推論されるためコンパイルエラーにすることができます。
コンパイルエラーを修正する方法
この値を代入するには、undefinedable
がnumber
であることを確認するか、undefined
でない事を確認する必要があります。
if (typeof undefinedable === 'number') {
const numberOnly: number = undefinedable;
}
if (undefinedable) {
const numberOnly: number = undefinedable;
}
あるいは、値の存在が自明なときはnon-nullアサーション演算子(!
)を使う事もできます。
const numberOnly: number = undefinedable!;
このコンパイルエラーは毎回チェックの手間がかかる割に多くの場合では有効に機能しないと言われているらしく、デフォルトでオンになったりstrict: true
に含まれたりはしていないようです。