Почему машинопись выдает ошибку для двух массивов типов объектов, но не в форме обоих? - PullRequest
0 голосов
/ 10 ноября 2018

У меня есть два простых типа данных:

type IData = {
  percent: string;
  exchange: string;
};

type IRow = {
  price: number;
  exchange: string;
};

Я не понимаю, почему машинопись выдает ошибки здесь, если я использую их обоих:

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;

Почему это случилось? https://codesandbox.io/s/16vzvqqv3 (Проверьте Errors.ts и NoErrors.ts)

1 Ответ

0 голосов
/ 10 ноября 2018

Когда assets объявляется как объединение массивов

assets: IData[] | IRow[]

assets.reduce() имеет разные объявления в каждом типе массива: для IData[] массива, reduce() принимает обратный вызов, который получает элемент IData, для IRow[] массива, reduce() принимает обратный вызов, который получает IRow элемент.

Сообщение об ошибке - «Невозможно вызвать выражение, тип которого не имеет подписи вызова» - в основном говорит о том, что компиляции недостаточно умны, чтобы признать, что можно вызвать reduce() для типа объединения, даже когда оно получает соответствующий тип обратного вызова.

Существует открытый вопрос для этого :

Это в настоящее время разработано, потому что мы не синтезируем подпись межсекторального вызова при получении членов типа объединения - только объединенные подписи, которые идентичны, появляются на объединенном типе

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...