首页 > 解决方案 > 如何对过滤 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"
  )

如何使用 typeguard 解决这个问题?

标签: typescripttypeguards

解决方案


我倾向于这样定义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])[] */

并且您看到返回的数组类型具有 type 的元素["name", string] | ["age", number],正如我假设您想要的那样。

希望有帮助;祝你好运!

Playground 代码链接


推荐阅读