过滤器不会过滤未定义的

filter wont filter undefined

盯着这段代码看了一段时间..

需要一些帮助

我有这个过滤器,我正在尝试从数组中删除未定义的对象:

  .then((items) => {
    const filtered = items.map( i => {
      if (i !== undefined) {
        return i
      }
    })
    updateState(filtered, query)
  });

后面是过滤后的给错:

Argument of type '({ service: Service; results: Card[]; } | undefined)[]' is not assignable to parameter of type 'SearchResult[]'.
  Type '{ service: Service; results: Card[]; } | undefined' is not assignable to type 'SearchResult'.
    Type 'undefined' is not assignable to type 'SearchResult'.

当我尝试将它传递给 updateState() 函数时。

过滤器不应该这样做吗?从数组中删除未定义的项目.. 这是怎么回事?

编辑:即使使用类型断言进行过滤也会产生相同的错误..

const filtered: SearchResult[] = results.filter( i => i as SearchResult)

同样的结果..

谢谢

如果您没有 return 来自 map 函数的值,它 returns undefined,因此您当前代码中的 return undefined 值仍然是 undefined.

您可以通过使用 filter 而不是地图来获得您想要的结果,或者当您的地图遇到 undefined 时 return 使用 undefined 以外的默认值。

所以,事实证明 Typescript 无法在此处确定 return 的类型..

在长期滥用 google 使用不同关键字进行搜索后,我想到了这一行

const filtered: SearchResult[] = results.filter( (i): i is SearchResult => !!i)

我从这个博客中得到它 post: https://www.benmvp.com/blog/filtering-undefined-elements-from-array-typescript/

祝大家有个愉快的一天!

当使用map过滤掉undefined(或其他类型)值时,您实际上可以使用flatMap代替(如果您不想使用filter).

方法如下:

const filtered = items.flatMap((item) => (item ? [item] : []));

请注意,通过这种方式,Typescript 将为您的数组推断出正确的类型

或者,使用完整语法:

const filtered = items.flatMap((item) => {
  if (item !== undefined) return [item];
  else return [];
});

您甚至可以删除不需要的方括号:

const filtered = items.flatMap((item) => {
  if (item !== undefined) return item;
  else return [];
});

const filtered = items.flatMap((item) => (item ? item : []));