如何类型保护过滤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]
类型的元素,正如我假设您想要的那样。
希望对您有所帮助;祝你好运!
我希望有类似 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]
类型的元素,正如我假设您想要的那样。
希望对您有所帮助;祝你好运!