noPropertyAccessFromIndexSignature
TypeScript v4.2~
index signatureで定義した型は、['piyo']という形式でアクセスすることを強制する
.piyoという形式でアクセスするとerrorになる
docs
以下の2つの宣言に対し、アクセス時に区別できる
①defined propertyとして定義したもの
②index signatureとして定義したもの
e.g. [key: string]: string;
例えば以下のように定義した際に
code:ts
type Hoge = {
speed: "fast" | "medium" | "slow"; // ①
key: string: string; // ②
}
以下のような挙動になる
code:ts
hoge.speed // ok
hoge.username // error。  noPropertyAccessFromIndexSignature:faseだとokになる
hoge'username' // ok
つまり、index signatureで定義したものに対しては
.piyoという形式でアクセスすることが禁止される
['piyo']という形式でアクセスしないといけない
何が嬉しいのか?
propertyにアクセスしている構文を見た時に、それが
defined propertyなのか
index signatureなのか
を見た目で判断できるようになった
「.piyoの形式で書かれている」ということは、「そのproperty piyoは必ず存在する」と判断できる
基本的に安全なアクセスだということ
「['piyo']の形式で書かれている」ということは、「もしかしたらそのpropertyは存在しない」と判断できる
安全ではないアクセスだよというのを、構文を見るだけで判断できる
index signatureは、後から任意の項目を追加できるので、そのpropertyの中身が必ずあることを保証できない
hoge['piyo']の中身が本当に定義されているかどうか、型レベルで保証できない
理想的には、string|undefinedになるのが安全ではある
これは、noUncheckedIndexedAccessを有効すると実現できるmrsekut.icon
つまり、noPropertyAccessFromIndexSignatureを有効にしたところで何も型安全にはなっていないmrsekut.icon
ただ、利用者が「安全なのか、安全でないのか」を、構文を見るだけで判断できるようになった、ということ
参考
noPropertyAccessFromIndexSignature | TypeScript入門『サバイバルTypeScript』