generated at
index signature
object型を定義する際の [key: string] の記法
ts
type A = { [key: string]: number }
型安全でない ref
string であれば何でも許容してしまう
更に悪いことに、返り値は number|undefined ではなく、全て number になる



[key: T] T の部分に使える型は以下の4つのみ
string
number
symbol
ts
type A = { [key: string]: unknown; [key: `hoge${string}`]: unknown; [key: number]: unknown; [key: symbol]: unknown; };
リテラル型は使えない
ts
type A = { [key: 42]: unknown; // NG [key: 'hoge']: unknown; // NG };
これはindex signature使わずに { 42: .., hoge: ..} で定義すれば良いだけなので、特に困ることはないmrsekut
型変数は使えない
T extends string の型制約があったとしても型変数は使えない
リテラル型も含んでしまうからか?
ts
type A<K extends string> = { [key: K]: unknown; // NG };



判定



Hoge[number] のようにしてアクセスできる
ts
type Tuple = { [x: number]: 'a' | 'b' | 'c' | 'd'; }; type A = Tuple[number]; // 'a' | 'b' | 'c' | 'd'


indexの部分:とinの違いってなんだっけ #??
[x: string [x in string] の違い