typescript - 使用泛型和其余属性的打字稿功能不会自动收集所有可能的类型
问题描述
请参阅下面的最低代码。
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
类型,有没有办法实现这一点?
解决方案
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
用于示例调用),然后使用返回数组数组[][]
推荐阅读
- neural-network - 人工神经网络中的记忆
- .net - Azure 文件服务客户端/对象是线程安全的吗?它们可以被缓存吗?
- python - AWS boto3 - 如何显示图像而不是强制下载
- terminal - 运行终端并在启动时输入命令(Raspberry Pi)
- batch-file - DOS下不能输入变量
- java - liquibase中有替换功能吗?
- java - 如何为秋千桌的不可编辑区域重新着色?
- php - 如果数组为空,PHP 运算符 <= 返回 true
- node.js - Heroku 部署忽略我的文件和文件夹
- php - Laravel Tap Formatter:我在哪里实际格式化消息?