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()
,即使它接收到适当的回调类型也是如此

:

这是目前的设计,因为我们没有合成一个 获取联合类型成员时的交叉调用签名 --联合类型上仅显示相同的呼叫签名