index signature
object型を定義する際の [key: string]
の記法
tstype A = {
[key: string]: number
}
string
であれば何でも許容してしまう
更に悪いことに、返り値は number|undefined
ではなく、全て number
になる
[key: T]
の T
の部分に使える型は以下の4つのみ
string
number
symbol
例
tstype A = {
[key: string]: unknown;
[key: `hoge${string}`]: unknown;
[key: number]: unknown;
[key: symbol]: unknown;
};
リテラル型は使えない
tstype A = {
[key: 42]: unknown; // NG
[key: 'hoge']: unknown; // NG
};
これはindex signature使わずに
{ 42: .., hoge: ..}
で定義すれば良いだけなので、特に困ることはない

型変数は使えない
T extends string
の型制約があったとしても型変数は使えない
リテラル型も含んでしまうからか?
tstype A<K extends string> = {
[key: K]: unknown; // NG
};
判定
Hoge[number]
のようにしてアクセスできる
tstype Tuple = {
[x: number]: 'a' | 'b' | 'c' | 'd';
};
type A = Tuple[number]; // 'a' | 'b' | 'c' | 'd'
[x: string
と [x in string]
の違い