如何在TypeScript泛型函数中正确使用Parameters<>工具类型?
解决TypeScript泛型方法Parameters工具类型的类型不匹配问题
问题场景
定义包含泛型方法的类:
class MyTestClass { getValue<T>(group: string, defaultVal: T): T {} }
尝试用Parameters工具类型定义单元测试的参数数组:
const argList1: Parameters<MyTestClass['getValue']> = ['group_1', 123]; const service = new MyTestClass(); const testValue1 = service.getValue<number>(...argList1);
执行时出现类型错误:
Argument of type 'unknown' is not assignable to parameter of type 'number'.ts(2345)
原因是Parameters<MyTestClass['getValue']>未指定泛型T,导致第二个参数被推断为unknown,与调用时指定的number类型不兼容。
解决方案
1. 给Parameters明确指定泛型参数
直接为泛型方法指定具体的T类型,让Parameters生成对应类型的参数数组:
// 指定T为number,参数数组类型变为[string, number] const argList1: Parameters<MyTestClass['getValue']<number>> = ['group_1', 123]; const service = new MyTestClass(); // 无需再手动指定<number>,类型会自动匹配 const testValue1 = service.getValue(...argList1);
注:该写法需要TypeScript 4.7及以上版本支持。
2. 封装带泛型的类型别名
通过类型别名封装泛型参数的Parameters推导,提升复用性:
type GetValueParams<T> = Parameters<MyTestClass['getValue']<T>>; // 传入number作为泛型参数 const argList1: GetValueParams<number> = ['group_1', 123]; const service = new MyTestClass(); const testValue1 = service.getValue(...argList1);
3. 使用const断言自动推导类型
无需手动指定泛型,通过const断言让TypeScript推导参数数组的具体类型:
// const断言会让数组元素类型锁定为字面量类型,自动推导T为number const argList1 = ['group_1', 123] as const; const service = new MyTestClass(); // 自动匹配泛型类型,无需手动指定 const testValue1 = service.getValue(...argList1);
这种方式最简洁,适合测试场景下直接定义参数的场景。
4. 用辅助函数生成参数数组
如果需要复用参数生成逻辑,可以编写辅助函数自动推导泛型:
function createGetValueArgs<T>(group: string, defaultVal: T): Parameters<MyTestClass['getValue']<T>> { return [group, defaultVal]; } // 自动推导T为number const argList1 = createGetValueArgs('group_1', 123); const service = new MyTestClass(); const testValue1 = service.getValue(...argList1);
内容的提问来源于stack exchange,提问作者XenoByteZero
相关产品推荐
相关产品推荐

