gpt4 book ai didi

typescript ,当被调用者数组与空数组联合时,Array.prototype.map() 有错误 'expression is not callable'

转载 作者:行者123 更新时间:2023-12-03 15:25:36 26 4
gpt4 key购买 nike

我有一个类型别名 Data这是两个数据结构的联合——一个包含非空数组,而另一个为空:

const dataEmptyArray = { data: [] }
const dataNotEmptyArray = { data: [1, 2, 3] }

type DataEmptyArray = typeof dataEmptyArray
type DataNotEmptyArray = typeof dataNotEmptyArray

type Data = DataNotEmptyArray | DataEmptyArray // <--- union here

function foo(arg:Data) {
if (arg && arg.data && Array.isArray(arg.data)) {
return arg.data.map( (d:(never|number)) => d)
// ^^^<--------- this expression is not callable
} else {
return 'no data'
}
}

const result = foo(dataEmptyArray)

但是,当我尝试在数组上调用 Array.prototype.map() 时,出现错误提示:
“这个表达式是不可调用的”

上面的片段可以在 here 中找到

我注意到,如果我将 Data 的别名定义为交集,我可以消除类型错误:

type Data = DataNotEmptyArray & DataEmptyArray

或者干脆不要与 DataEmptyArray 联合

type Data = DataNotEmptyArray

你能解释一下为什么与空数组联合是一个问题吗?
当它说“表达式不可调用”时是什么意思?
谢谢!!

最佳答案

选项1
将 typescript 更新为 4.2+ (我推荐最新版本)
这适用于 .map ,但它不适用于 .reduce
截至 2021 年 7 月,还有一个关于 .reduce 的未决问题。案件:
https://github.com/microsoft/TypeScript/issues/44063
选项 2
同时您可以添加 as any[]摆脱错误:
对于 .map :

const arr: number[] | string[] = [];
// Add as any[]
(arr as any[]).map((a: number | string, index: number) => {
return index
});
对于 .reduce :
const arr: number[] | string[] = [];
// Add as any[]
(arr as any[]).reduce((acc: number | string, val: number|string) => {
return `${acc} ${val}`
},'');
更多信息
有关更多信息,请参阅原始 Github 问题:
https://github.com/microsoft/TypeScript/issues/36390

关于 typescript ,当被调用者数组与空数组联合时,Array.prototype.map() 有错误 'expression is not callable',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58772314/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com