如何使用地图类型为`Object.keys`定义类型?

时间:2017-07-21 04:08:56

标签: typescript mapped-types

我想使用typescript映射类型定义更严格的Object.keys函数。

实施例

假设我有一个用const定义的对象:

const myObj = {
  a: 'some value',
  b: 5
};

当我在此对象上使用Object.keys时,返回的类型为string[]

const keysOfMyObj = Object.keys(myObj); // `const keysOfMyObj: string[]`

问题:

相反,我希望这种类型更具体。如果string[]返回Object.keys类型,我更愿意返回类型("a" | "b")[]

所需类型:

const newKeysOfMyObj = myKeys(myObj); // `const newKeysOfMyObj: ("a" | "b")[]`

我尝试了什么:

我认为这可以使用typescript mapped types完成。

我已经定义了一个断言类型的类型是一个对象的值与键相同:

type Keys<T> = {
  [P in keyof T]: P;
};

let myObjKeysOnly: Keys<typeof myObj>;

// resulting type:
// ```
// let myObjKeysOnly: {
//   a: "a";
//   b: "b";
// }
// ```

我尝试将此函数实现为Object.keys上的类型化包装:

function myKeys<T>(obj: T) {
  return Object.keys(obj) as (Keys<T>);
}

有什么想法吗?

1 个答案:

答案 0 :(得分:2)

您可以使用keyof

function myKeys<T>(obj: T): keyof T[] {
  return Object.keys(obj) as any;
}

const x = myKeys({ a: 123, b: 123 });

更多

移动类型:https://basarat.gitbooks.io/typescript/content/docs/types/moving-types.html