あなた:
typescriptで、let aaa = {} みたいにして、あとから、aaa["ccc"] = [2,2,3,4] みたいなことにして、どんどんキーを追加していくコードを書きたい
TypeScript でそのように「空のオブジェクトを作ってから、あとで自由にキーを追加していく」書き方をする場合、型定義をしないとエラーになります。
TypeScript はデフォルトで {} を「プロパティを持たないオブジェクト」として扱うためです。
こういうときは、インデックスシグネチャを使います。
tslet aaa: { [key: string]: number[] } = {};
aaa["ccc"] = [2, 2, 3, 4];
aaa["ddd"] = [1, 5, 9];
これで aaa は「キーが文字列で、値が number 配列」のオブジェクトになります。
もし「数値配列だけでなく、あとから違う型も入れたい」場合は any を使うこともできます。
tslet aaa: { [key: string]: any } = {};
aaa["ccc"] = [2, 2, 3, 4];
aaa["xyz"] = "文字列でもOK";
aaa["obj"] = { a: 1 };
Record を使う書き方(同義)tslet aaa: Record<string, number[]> = {};
aaa["ccc"] = [2, 2, 3, 4];
Record<K, T> は「キーが K 型、値が T 型のオブジェクト」という定義です。
インデックスシグネチャの省略表現のようなものです。
どれも同じ動作をしますが、
型を厳密にしたいなら { [key: string]: number[] }
ゆるくしたいなら { [key: string]: any }
書き方を簡潔にしたいなら Record<string, number[]>
この3つのどれかを使えば目的の挙動になります。