如何类型保护过滤Object.entries?

How to typeguard filtering Object.entries?

我希望有类似 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"
  )

如何使用类型保护来解决这个问题?

我倾向于这样定义 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