1

我用 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'.

这是为什么?不是所有具有属性的对象在被ped之前都nameundefined过滤掉了吗?map如果我将select函数的返回类型更改为(string | undefined)[],则编译成功。

4

1 回答 1

2

您过滤了一个数组,但它filter本身并没有改变返回类型,所以这就是filter(e => e.name !== undefined)返回的原因(string | undefined)[]。您应该“转换”e.name为字符串以(string | undefined)变成string

.map(e => e.name as string)
于 2020-11-11T12:43:08.193 回答