В чем разница между `MyInterfaceOne [] |MyInterfaceTwo [] `и` (MyInterfaceOne | MyInterfaceTwo) [] ` - PullRequest
4 голосов
/ 05 июня 2019

При использовании MyInterfaceOne[] | MyInterfaceTwo[] я получаю ошибку Typescript в другом месте моего кода, которая не имеет смысла для меня.

myInterfaces = funcWithAboveSignature()

return myInterfaces.reduce(async (acc, interfaceType) => {
    await acc;
    if (interfaceType.prop) {
      return await someAsyncFunc(interfaceType);
    } else {
      return await someOtherAsyncFunc(interfaceType);
    }
  }, Promise.resolve());

Ошибка говорит:

Argument of type '(acc: MyInterfaceOne, raw: MyInterfaceOne) => Promise<void>' is not assignable to parameter of type '(previousValue: MyInterfaceOne, currentValue: MyInterfaceOne, currentIndex: number, array: MyInterfaceOne[]) => MyInterfaceOne'.

Но при изменении сигнатуры функции с MyInterfaceOne[] | MyInterfaceTwo[] на (MyInterfaceOne|MyInterfaceTwo)[] она работает.

Может кто-нибудь объяснить мне разницу между этими двумя?

1 Ответ

5 голосов
/ 05 июня 2019
MyInterfaceOne[] | MyInterfaceTwo[]

говорит, что это может быть либо массив только MyInterfaceOne, либо массив только MyInterfaceTwo.

(MyInterfaceOne|MyInterfaceTwo)[]

говорит, что это может быть массив MyInterfaceOne или MyInterfaceTwo, поэтому он может содержать элементы любого из двух типов.

...