【问题标题】:Tyepescript how to filter an array of objects depending on a specific property exists or notTypescript如何根据特定属性是否存在过滤对象数组
【发布时间】:2022-01-24 12:36:13
【问题描述】:

我尝试根据对象是否具有特定属性来过滤对象。

例子:

objectArray = [{a: "", b: ""}, {a: ""}]
objectArray.filter( obj => "b" in obj ).forEach(obj => console.log(**obj.b**))

typescript 抱怨 obj.b,因为某些对象没有 b 属性,但由于我将它们过滤掉,所以不应该。我在做什么/做错了什么。

【问题讨论】:

  • 你得到的错误是因为**。那些是什么
  • 请提供minimal reproducible example,清楚地表明您面临的问题。理想情况下,有人可以将代码放入像The TypeScript Playground (link here!) 这样的独立 IDE 中,然后立即着手解决问题,而无需首先重新创建它。所以不应该有伪代码、拼写错误、不相关的错误或未声明的类型或值。

标签: node.js typescript


【解决方案1】:

在初始化它的同一语句中声明objectArray(使用letconst)。这将允许 TypeScript 正确推断表达式 objectArray.filter( obj => "b" in obj ) 的类型,即

const objectArray = [{a: "", b: ""}, {a: ""}];
objectArray.filter( obj => "b" in obj ).forEach(obj => console.log(obj.b)); // no error

Playground link

【讨论】:

    【解决方案2】:

    Objects.keys 可以帮助你

    objectArray.filter(x=> Object.keys(x).indexOf('b')>=0 );
    

    【讨论】:

    • 这 a) 不能解决问题,b) 比 OP 的代码慢得多,而且更复杂。 in 运算符经过高度优化,通常被 Typescript 编译器识别为类型缩小检查,您的版本需要构造一个数组然后线性遍历它,即 O(n^2),并且不是编译器使用的机制之一缩小值的类型。
    猜你喜欢
    • 2017-05-25
    • 2021-04-15
    • 2018-12-25
    • 2018-07-06
    • 2021-09-02
    相关资源
    最近更新 更多