Javascript 为什么typescript会对两个对象类型数组抛出错误,但不会';两者的形状如何?
我有两种简单的数据类型:Javascript 为什么typescript会对两个对象类型数组抛出错误,但不会';两者的形状如何?,javascript,arrays,typescript,javascript-objects,Javascript,Arrays,Typescript,Javascript Objects,我有两种简单的数据类型: type IData = { percent: string; exchange: string; }; type IRow = { price: number; exchange: string; }; 我不明白如果我同时使用typescript,为什么会在这里抛出错误: const sumSame = ( assets: IData[] | IRow[], sumBy: string, sumWhat: string ) =>
type IData = {
percent: string;
exchange: string;
};
type IRow = {
price: number;
exchange: string;
};
我不明白如果我同时使用typescript,为什么会在这里抛出错误:
const sumSame = (
assets: IData[] | IRow[],
sumBy: string,
sumWhat: string
) => {
const mapWithUniqCoins = assets.reduce((accMap, el: IData | IRow) => {
if (accMap.has(el[sumBy])) {
accMap.set(el[sumBy], {
...accMap.get(el[sumBy]),
[sumWhat]: accMap.get(el[sumBy])[sumWhat] =
+accMap.get(el[sumBy])[sumWhat] + parseFloat(el[sumWhat])
});
} else {
accMap.set(el[sumBy], el);
}
return accMap;
}, new Map());
return [...mapWithUniqCoins.values()];
};
但当我将两种类型组合成一个形状时,它不会抛出错误:
type Shape = IData | IRow;
为什么会这样?
(检查Errors.ts和NoErrors.ts)当
资产
被声明为数组的并集时
assets: IData[] | IRow[]
assets.reduce()
在每种数组类型中都有不同的声明:对于IData[]
数组,reduce()
接受接收IData
元素的回调,对于IRow[]
数组,reduce()
接受接收IRow
元素的回调
错误消息-“无法调用类型缺少调用签名的表达式”-基本上说明编译器不够聪明,无法识别可以为联合类型调用reduce()
,即使它接收到适当的回调类型也是如此
:
这是目前的设计,因为我们没有合成一个
获取联合类型成员时的交叉调用签名
--联合类型上仅显示相同的呼叫签名