Функция Typescript с использованием обобщенных и остальных свойств не собирает все возможные типы автоматически - PullRequest
1 голос
/ 19 марта 2019

Пожалуйста, смотрите этот минимальный код ниже.

function zip<T>(...arrs: T[][]): T[][] {
  return arrs
}

zip([1,2,3], ['a', 'b', 'c'])
// Type 'string' is not assignable to type 'number'.ts(2322)

zip<number | string>([1,2,3], ['a', 'b', 'c'])
// Ok, but a little bit bother to me.

Я создал функцию, используя свойства generics и rest.

Когда я непосредственно использую zip([1,2,3], ['a', 'b', 'c']), я ожидаю, чтомашинопись автоматически обнаруживает, что я использую тип number | string, есть ли способ добиться этого?

enter image description here

1 Ответ

1 голос
/ 19 марта 2019

Typescript видит первый параметр number[], и это исправляет T, а затем вы получите ошибку для второго.Хотя теоретически T можно вывести на string | number Я бы сказал, что текущее поведение, как правило, хорошо, но более вероятно, что предполагаемые союзы приведут к неожиданным ошибкам в других местах.

Вы можете получитькомпилятор примет вызов, который вы хотите, если вы заставите компилятор рассматривать все аргументы как единое целое, а не по отдельности, используя кортежи в параметрах rest:

function zip<T extends any[][]>(...arrs: T): (T[number][number])[][] {
    return arrs
}

zip([1,2,3], ['a', 'b', 'c'])

T будет типом кортежа для примера вызова([number[], string[]], поэтому для получения типа элемента мы используем T[number][number] (который будет string | number для примера вызова), а для возврата к массиву массивов, используя [][]

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