为什么过滤具有未定义键的对象会在 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
的对象在 map
ped 之前都被 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)
我用启用了严格模式的 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
的对象在 map
ped 之前都被 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)