tsconfig.json にて noImplicitAny: false または noImplicitAny が未定義かつ、 strict: true ではない場合、
配列要素に文字列のキーでアクセスすると、
Element implicitly has an 'any' type because index expression is not of type 'number'.ts(7015)
というエラーが表示されるが、
このエラーが表示されない条件では、配列の要素を取得したときに any 型になってしまい、正しく型推論が行われない。
例えば、次のコードでは、
Object.keys(array) で文字列型のキーの配列を取得できるため、問題ないように見えるが、
知らないと気付かないうちに、文字列で取得した配列要素がany型になってしまう。
const array: T[] = [];
Object.keys(array).map(key => {
const element = array[key]; // element は any
return element;
});
また、オブジェクトでは使えるはずの keyof は配列では簡単に使えず、解決策にならない。
array[key as keyof T[]] = newElement
この場合、
Cannot assign to '[Symbol.unscopables]' because it is a read-only property.ts(2540)
という謎のエラーが表示される。
おそらく配列のキーに含まれる Symbol.unscopables が読み取り専用のため、代入式を書くとエラーになってしまう。
もし、オブジェクトと同様に子要素にアクセスしようとして、それを型推論したい場合は、
配列のキーには必ず number 型を使用するべき。
[...Array(array.length)].map((_, i) => {
const element = array[i];
return element;
});
参考