TypeScript泛型Rest参数自动匹配回调入参类型实现方法
TypeScript 剩余参数关联回调参数类型实现方案
核心实现思路是用泛型元组类型捕获传入的剩余参数类型序列,再将该元组类型直接绑定为回调函数的参数类型,建立两者的类型关联,TS就会自动按位置推导对应参数类型。
正确的函数定义
async function SampleFunction<T extends unknown[]>( cb: (...args: T) => void, ...args: T ) { // 内部执行逻辑,调用回调时直接展开传入的剩余参数即可 cb(...args); // 其他自定义业务逻辑写在这里 }
之前写法失效的原因:回调参数类型和剩余参数类型被分别定义为
() => void和any[],两者没有建立类型关联,TS无法推导回调的参数类型,因此会隐式标记为any。
推导效果验证
使用示例代码时,TS会自动完成类型匹配:
let stringVariable = "lorem"; let numberVariable = 8; SampleFunction( (stringArg, numberArg) => { // stringArg 自动推导为 string 类型 // numberArg 自动推导为 number 类型 stringArg.toUpperCase(); // 类型校验通过 numberArg.toFixed(2); // 类型校验通过 // 若调用类型不匹配的方法,比如 stringArg.toFixed(),TS会直接抛出类型错误 }, stringVariable, numberVariable );
自带类型校验能力
该写法会自动完成以下类型校验,不需要额外写类型声明:
- 回调函数的参数个数和传入的剩余参数个数不匹配时,抛出类型错误
- 回调函数对应位置的参数类型和传入实参类型不兼容时,抛出类型错误
- 支持任意数量的剩余参数,不需要提前固定参数长度
该写法兼容TypeScript 3.0及以上所有版本,不需要额外修改编译配置。
内容的提问来源于stack exchange,提问作者jetenergy
相关产品推荐
相关产品推荐

