TypeScript массив объединения против объединения массива - PullRequest
0 голосов
/ 03 января 2019

Компилятор TypeScript ведет себя по-разному, если у меня есть объединение массивов и массив объединений:

type A = { x: string };
type B = { x: string, y: number };

const arr1: (A | B)[] = [];
arr1.find(e => e.x === ""); // OK
arr1.map(e => e.x); // OK

const arr2: A[] | B[] = [];
arr2.find(e => e.x === ""); // OK
arr2.map(e => e.x); // Error: Cannot invoke an expression whose type lacks a call signature.

Разве это не должно arr2.map(e => e.x) работать?

1 Ответ

0 голосов
/ 03 января 2019

В настоящее время это не работает. Так как методы A[] и B[] имеют разные подписи, если вы поместите их в объединение, соответствующий метод будет объединением исходных подписей и, следовательно, не будет вызван.

Это ограничение будет снято в будущей версии машинописного текста, как описано здесь (возможно, в выпуске за январь 2019 года). С учетом изложенных изменений ваш пример должен работать так, как ожидалось, но в настоящее время я не проверял это.

А пока лучшее решение - использовать утверждение типа:

(arr2 as (A | B)[]) .map(e => e.x); 
...