2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

TypeScript 配列要素に文字列でアクセスしたり、配列をオブジェクトのように扱ってはいけない理由

Last updated at Posted at 2025-11-05

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;
});

参考

2
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?