首页 > 解决方案 > 使用泛型和其余属性的打字稿功能不会自动收集所有可能的类型

问题描述

请参阅下面的最低代码。

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.

我使用genericsrest属性创建了一个函数。

当我直接使用zip([1,2,3], ['a', 'b', 'c'])时,我希望打字稿会自动发现我正在使用number | string类型,有没有办法实现这一点?

在此处输入图像描述

标签: typescriptrestgenerics

解决方案


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'])

T将是示例调用 ( 的元组类型[number[], string[]],因此要获取我们使用的项目类型T[number][number](将string | number用于示例调用),然后使用返回数组数组[][]


推荐阅读