为什么过滤具有未定义键的对象会在 TypeScript 严格模式下出错

Why filtering objects which has undefined key gives error in TypeScript strict mode

我用启用了严格模式的 TypeScript 编写了这段代码。

const arr: ({ name?: string })[] = [
    { name: 'foo' },
    {},
    { name: 'bar' }
]

function select(): string[] {
    return arr
        .filter(e => e.name !== undefined)
        .map(e => e.name)
}

编译失败并出现此错误:

Type '(string | undefined)[]' is not assignable to type 'string[]'.
  Type 'string | undefined' is not assignable to type 'string'.
    Type 'undefined' is not assignable to type 'string'.

这是为什么?不是所有带有 属性 name 的对象在 mapped 之前都被 undefined 过滤掉了吗?如果我将 select 函数的 return 类型更改为 (string | undefined)[],它会成功编译。

您筛选了一个数组,但 filter 本身不会更改返回类型,因此这就是 filter(e => e.name !== undefined) returns (string | undefined)[] 的原因。 您应该将 e.name“转换”为字符串以将 (string | undefined) 转换为 string:

.map(e => e.name as string)