【问题标题】:How to typeguard filtering Object.entries?如何对过滤 Object.entries 进行类型保护?
【发布时间】:2020-06-15 02:42:44
【问题描述】:

我希望有类似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 解决这个问题?

【问题讨论】:

    标签: typescript typeguards


    【解决方案1】:

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

    【讨论】:

    • 非常酷,谢谢!我什至明白,除了最后一部分:[keyof T] 最后在说什么?
    • 这是looking up 的值。 {[K in keyof T]: [K, T[K]} 看起来像 {name: ["name", string]; age: ["age", number]},所以我正在查找 ["name" | "age"] 的属性值。见this other answer
    猜你喜欢
    • 2021-05-03
    • 1970-01-01
    • 2020-09-15
    • 1970-01-01
    • 1970-01-01
    • 2021-09-20
    • 2021-06-30
    • 2023-01-10
    • 1970-01-01
    相关资源
    最近更新 更多