首页 > 解决方案 > 打字稿中的过滤器出现“(字符串| null)[]”错误不可分配

问题描述

我有一个对象数组,其中一个属性有一个空值,我使用过滤器将其删除,但打字稿给我警告 null 不可分配?因为过滤器永远不会返回 null 为什么打字稿给我这样的错误?

const data = [
  {
    id: "123"
  },
  {
    id: "456"
  },
  {
    id: null
  }
];

const d2: string[] = data.map((d) => d.id).filter((o) => o);

console.log(d2);

演示https://codesandbox.io/s/gallant-water-vio56?file=/src/index.ts:0-165

标签: javascripttypescript

解决方案


Typescript 无法弄清楚这.filter((o) => o)会缩小数组的类型,而不是没有一些帮助。您可以定义自定义类型保护并使用它。例如:

function notNull<T>(val: T | null): val is T {
    return val !== null;
}

const d2 = data.map((d) => d.id).filter(notNull); // d2 is a string[]

或仅适用于字符串的内联版本:

const d2 = data.map(d => d.id).filter((o): o is string => !!o);

游乐场链接


推荐阅读