配列要素へのアクセス
JavaScriptでの配列要素アクセス
JavaScriptの配列の要素にアクセスするにはブラケット[]
を使います。ブラケットにはアクセスする要素のインデックス番号を書きます。インデックス番号は0始まりです。たとえば、abc = ["a", "b", "c"]
の1つ目の要素にアクセスするには、abc[0]
と書きます。
js
constabc = ["a", "b", "c"];console .log (abc [0]);
js
constabc = ["a", "b", "c"];console .log (abc [0]);
JavaScriptの配列では、存在しないインデックス番号でもアクセスできます。その場合でも、JavaScriptではエラーになりません。得られる値はundefined
になります。
js
constabc = ["a", "b", "c"];console .log (abc [100]);
js
constabc = ["a", "b", "c"];console .log (abc [100]);
TypeScriptの要素の型
TypeScriptでは、Type[]
型の配列から要素を取り出したとき、その値の型はType
になります。たとえば、string[]
型から0番目の要素の型はstring
になります。
ts
constabc : string[] = ["a", "b", "c"];constcharacter : string =abc [0];
ts
constabc : string[] = ["a", "b", "c"];constcharacter : string =abc [0];
JavaScriptでは存在しないインデックスで要素アクセスした場合、エラーにならず、代わりにundefined
が得られると説明しましたが、TypeScriptでも不在要素へのアクセスについて、コンパイラーが警告することはありません。
ts
constabc = ["a", "b", "c"];constcharacter : string =abc [100]; // エラーにはならない
ts
constabc = ["a", "b", "c"];constcharacter : string =abc [100]; // エラーにはならない
要素アクセスで得た値はstring
とundefined
どちらの可能性もありながら、TypeScriptは常にstring型であると考えるようになっています。そのため、要素アクセスでundefined
が返ってくる場合のエラーはTypeScriptでは発見できず、JavaScript実行時に判明することになります。
ts
constabc = ["a", "b", "c"];constcharacter : string =abc [100];console .log (character );character .toUpperCase ();
ts
constabc = ["a", "b", "c"];constcharacter : string =abc [100];console .log (character );character .toUpperCase ();
TypeScriptで要素アクセスを型安全にする設定
TypeScriptにこの問題を指摘してもらうようにするには、コンパイラーオプションのnoUncheckedIndexedAccess
を有効にします。
📄️ noUncheckedIndexedAccess
インデックス型のプロパティや配列要素を参照したときundefinedのチェックを必須にする
これを有効にすると、たとえば、string[]
配列から要素アクセスで得た値の型は、string型もしくはundefined型を意味するstring | undefined
になります。
ts
constabc : string[] = ["a", "b", "c"];constcharacter : string | undefined =abc [0];character .toUpperCase ();
ts
constabc : string[] = ["a", "b", "c"];constcharacter : string | undefined =abc [0];character .toUpperCase ();
string | undefined
型のままではtoUpperCase
などのstring型のメソッドは呼び出せません。そこで、if文で変数がstring型だけになるように絞り込みます。すると、string型のメソッドを呼び出してもコンパイルエラーで指摘されることがなくなります。
ts
constabc : string[] = ["a", "b", "c"];constcharacter =abc [0];// 絞り込み条件if (typeofcharacter === "string") {character .toUpperCase (); // コンパイルエラーにならない}
ts
constabc : string[] = ["a", "b", "c"];constcharacter =abc [0];// 絞り込み条件if (typeofcharacter === "string") {character .toUpperCase (); // コンパイルエラーにならない}
配列要素へのアクセスを安全にするために、noUncheckedIndexedAccess
を有効にしておくことを推奨します。