Cover image for TypeScriptのIndex Signature"{[key:string]:string}"で特定の文字だけのIndexを扱う
typescript

TypeScriptのIndex Signature"{[key:string]:string}"で特定の文字だけのIndexを扱う

March 04, 2019

2 min read

mitsuruogMitsuru Ogawa

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);

存在しないキーでアクセスしようとした時にコンパイラが検知するようになりました。

これで型安心になりました。

参考