TypeScript の小ネタです。
TypeScript で String をキーにしてオブジェクトにアクセスする場合、次のような Type を定義します。
const user: { [key: string]: string } = { name: "mitsuruog" };
console.log(user["name"]); // => mitsuruog
ただ、この String でアクセスする部分をもう少し型安心にしたいですね。
String のキーのセットで Type を作成して、Index Signature に適用できると型安心にできそうです。 試しに UnionType を使ってみます。
type Index = "name" | "address";
// Error: index signature parameter type cannot be a union type. Consider using a mapped object type instead.
const user: { [key: Index]: string } = { name: "mitsuruog" };
このままでは使えないようなので、Mapped Types を使ってみます。
type Index = "name" | "address";
// Error: Property 'address' is missing in type '{ name: string; }' but required in type '{ name: string; address: string; }'.
const user: { [key in Index]: string } = { name: "mitsuruog" };
今度は、オブジェクト初期化の時に全てのキーが必要になってしまったようです。なので Index を Optional にします。
type Index = "name" | "address";
const user: { [key in Index]?: string } = { name: "mitsuruog" };
console.log(object2.name);
// Error: Property 'password' does not exist on type '{ name?: string; address?: string; }'.
console.log(object2.password);
存在しないキーでアクセスしようとした時にコンパイラが検知するようになりました。
これで型安心になりました。