如何保护过滤Object.entries?

时间:2020-03-02 18:56:55

标签: typescript typeguards

我希望有entryof这样的内容来保护这样的条目:

const carDude = {
  name: "Tom",
  age: 45,
  car: "Porsche 911"
}

interface Dude {
  name: string;
  age: number;
}

Object
  .entries(carDude)
  .filter((entry): entry is entryof Dude => 
    entry[0] === "name" || entry[0] === "age"
  )

如何使用Typeguard解决该问题?

1 个答案:

答案 0 :(得分:2)

我倾向于这样定义EntryOf

type EntryOf<T extends object> = { [K in keyof T]: [K, T[K]] }[keyof T];

这将采用对象类型T,并将其变成条目元组的并集。然后您的代码可以写为

const ret = Object.entries(carDude).filter((entry): entry is EntryOf<Dude> =>
    entry[0] === "name" || entry[0] === "age"
);
/* const ret: (["name", string] | ["age", number])[] */

,您会发现返回的数组类型具有["name", string] | ["age", number]类型的元素,就像我想的那样。

希望有所帮助;祝你好运!

Playground link to code