noUncheckedIndexedAccess
noUncheckedIndexedAccess
はインデックス型のプロパティや配列要素を参照したときundefinedのチェックを必須にするコンパイラオプションです。
- デフォルト:
false
- 追加されたバージョン: 4.1
解説
インデックス型や配列で宣言されたオブジェクトが持つプロパティへのアクセスを厳密に評価します。
📄️ インデックス型
TypeScriptで、オブジェクトのフィールド名をあえて指定せず、プロパティのみを指定したい場合があります。そのときに使えるのがこのインデックス型(index signature)です。たとえば、プロパティがすべてnumber型であるオブジェクトは次のように型注釈します。
ts
typeObjectLiteralLike = {en : string;fr : string;it : string;[lang : string]: string;};typeArrayObjectLike = {0: string;1: string;[num : number]: string;};functionlog (s : string): void {console .log (s );}constbutterfly :ObjectLiteralLike = {en : "Butterfly",fr : "Papillon",it : "Farfalla",es : "Mariposa",};constphoneticCodes :ArrayObjectLike = {0: "alpha",1: "bravo",2: "charlie",};
ts
typeObjectLiteralLike = {en : string;fr : string;it : string;[lang : string]: string;};typeArrayObjectLike = {0: string;1: string;[num : number]: string;};functionlog (s : string): void {console .log (s );}constbutterfly :ObjectLiteralLike = {en : "Butterfly",fr : "Papillon",it : "Farfalla",es : "Mariposa",};constphoneticCodes :ArrayObjectLike = {0: "alpha",1: "bravo",2: "charlie",};
ObjectLiteralLike, ArrayObjectLike
は共にstring
型のプロパティを持つオブジェクトの型として宣言されています。
ts
constspanish : string =butterfly .es ;constthird : string =phoneticCodes [2];console .log (spanish );console .log (third );
ts
constspanish : string =butterfly .es ;constthird : string =phoneticCodes [2];console .log (spanish );console .log (third );
これらのオブジェクトのプロパティにアクセスするときは完全な型安全ではありません。このオプションを有効にすると次のようなエラーが発生します。
ts
constType 'string | undefined' is not assignable to type 'string'. Type 'undefined' is not assignable to type 'string'.2322Type 'string | undefined' is not assignable to type 'string'. Type 'undefined' is not assignable to type 'string'.: string = spanish butterfly .es ;constType 'string | undefined' is not assignable to type 'string'. Type 'undefined' is not assignable to type 'string'.2322Type 'string | undefined' is not assignable to type 'string'. Type 'undefined' is not assignable to type 'string'.: string = third phoneticCodes [2];
ts
constType 'string | undefined' is not assignable to type 'string'. Type 'undefined' is not assignable to type 'string'.2322Type 'string | undefined' is not assignable to type 'string'. Type 'undefined' is not assignable to type 'string'.: string = spanish butterfly .es ;constType 'string | undefined' is not assignable to type 'string'. Type 'undefined' is not assignable to type 'string'.2322Type 'string | undefined' is not assignable to type 'string'. Type 'undefined' is not assignable to type 'string'.: string = third phoneticCodes [2];
このように厳密に定義されていないプロパティはundefined
型とのユニオン型として解釈されるようになります。
ts
constspanish : string | undefined =butterfly .es ;constthird : string | undefined =phoneticCodes [2];
ts
constspanish : string | undefined =butterfly .es ;constthird : string | undefined =phoneticCodes [2];
配列はインデックス記法でアクセスをするとundefined
型とのユニオン型と解釈されますがfor-of, array.forEach()
はこの制約を受けないため積極的に使用を検討してください。
ts
constphoneticCodes : string[] = ["alpha", "bravo", "charlie"];for (constp ofphoneticCodes ) {// ...}phoneticCodes .forEach ((p : string) => {// ...});
ts
constphoneticCodes : string[] = ["alpha", "bravo", "charlie"];for (constp ofphoneticCodes ) {// ...}phoneticCodes .forEach ((p : string) => {// ...});