Эта функция:
const proxy = () => Math.random() < 0.5 ? numbersArray : stringsArray;
имеет тип возвращаемого значения:
number[] | string[]
Этот тип говорит, что у вас есть либо массив всех чисел, либо массив всех строк , но никогда не смешивать и то, и другое.
Итак, каков тип членов этого типа? Вы можете подумать, что это number | string
, но это не совсем правда. Если вы возьмете string | number
и добавите обозначение массива в конец, вы получите:
(number | string)[]
Этот тип говорит, что это массив строк или чисел, и каждый член может быть любым из них. Теперь вы можете смешать оба. Это не одно и то же. Это означает, что тип члена не может быть выведен, потому что этот тип члена не может использоваться для создания исходного типа массива.
Теперь давайте посмотрим на общую c функцию:
function func<T>(array: T[]): T[][] {
return [[array[0], array[1]], [array[2], array[3]]];
}
Эта функция пытается найти тип элемента T
для массива T[]
. Но, как показано выше, для string[] | number[]
нет подходящего типа члена. Таким образом, машинописный текст не может вывести T
и выдает ошибку.
Итак, чтобы ваша функция работала, тип члена T
должен быть выводимым. Вы можете сделать это, преобразовав возвращаемый тип прокси в совместимый тип массива, в котором только члены массива являются объединением.
const proxy: () => (string | number)[] =
() => Math.random() < 0.5 ? numbersArray : stringsArray;
Теперь T
может стать string | number
, и все работает так же, как вы ожидаем.
const resultUnion = func(proxy()); // type: (string | number)[][]
Детская площадка