Object.keys()に対する型推論と型指定の方法 – TypeScript

Object.keys()に対する型推論

Object.keys() は指定されたオブジェクトが持つプロパティ名を配列として返します。

const object = {
  name: 'Anthony',
  age: 32,
  occupation: 'engineer'
};

const properties = Object.keys(object);

console.log(properties); // ['name', 'age', 'occupation']

このときObject.keys()の返り値の型を確認してみると、TypeScriptはstring[]と型推論します。

const properties : string[]

しかしstring[]と型推論されると困る場合があります。

例えばObject.keysで取得した情報使って、再度オブジェクトを操作する場合です。

単純な例ですが、Object.keysで取得したプロパティ情報からそれぞれの値を配列で取得してみます。

properties.map( v =>{ return object[v]; } // ['Anthony', 32, 'engineer']

// Element implicitly has an 'any' type because expression of type 'string' can't be used to index type '{ name: string; age: number; occupation: string; }'.
// No index signature with a parameter of type 'string' was found on type '{ name: string; age: number; occupation: string; }'.

この場合、残念ながらTypeScriptはエラーを表示します。

指定したプロパティが本来のオブジェクトの型が一致しないため、TypeScriptは暗黙的にany型と推論します。

Object.keys()に対する型指定の方法

このエラーを回避するにはObject.keys()に対して「型アサーション」で適切な型を定義してあげます。

const properties = Object.keys(object) as Array<keyof typeof object>;

keyof typeof object で「objectのプロパティ名の共用体型(union type)」を表現するtypeを取得することができます。この場合は “name” | “age” | “occupation” です。

なので Array<keyof typeof object> は、(“name” | “age” | “occupation”)[] を表します。

これによりpropertiesの型は、

const properties : ("name" | "age" | "occupation")[]

となり、TypeScriptに正しく型推論させることができます。

Related Posts