使用泛型和rest属性的Typescript函数不';t自动收集所有可能的类型

使用泛型和rest属性的Typescript函数不';t自动收集所有可能的类型,typescript,rest,generics,Typescript,Rest,Generics,请参阅下面的最低代码 函数zip(…arrs:T[]]):T[][]{ 返回arrs } 邮政编码([1,2,3],'a','b','c']) //类型“string”不可分配给类型“number”。ts(2322) 邮政编码([1,2,3],'a','b','c']) //好吧,不过有点麻烦。 我使用generics和rest属性创建了一个函数 当我直接使用zip([1,2,3],'a','b','c'])时,我希望typescript自动发现我使用的是number | string类型,有

请参阅下面的最低代码

函数zip(…arrs:T[]]):T[][]{
返回arrs
}
邮政编码([1,2,3],'a','b','c'])
//类型“string”不可分配给类型“number”。ts(2322)
邮政编码([1,2,3],'a','b','c'])
//好吧,不过有点麻烦。
我使用
generics
rest
属性创建了一个函数

当我直接使用
zip([1,2,3],'a','b','c'])
时,我希望typescript自动发现我使用的是
number | string
类型,有什么方法可以实现这一点吗


Typescript看到第一个参数是
number[]
,这修复了
T
,然后第二个参数出现错误。虽然理论上可以将
T
推断为
string | number
,但我认为当前的行为通常是一件好事,但推断联合更可能导致其他地方出现意外错误

<>你可以让编译器接受你想要的调用,如果你让编译器用一个完整的参数来考虑所有的参数,而不是单独使用静息参数中的元组:

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

zip([1,2,3], ['a', 'b', 'c'])
函数zip(…arrs:T):(T[number][number])[]{
返回arrs
}
邮政编码([1,2,3],'a','b','c'])

T
将是示例调用的元组类型(
[number[],string[]]
),因此为了获得项目类型,我们使用
T[number][number]
(对于示例调用,它将是
string | number
),并使用
[]返回数组数组

现在这样做是正确的。您定义了一个函数,该函数可以压缩相同类型的数组,但数组的类型不同,因此会出现错误。如果这是您真正想要的行为,您应该添加信息(如显式联合类型)。我想我现在就知道了,谢谢!