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
для примера вызова), а для возврата к массиву массивов, используя [][]