我有一堂课看起来像这样
class MyTestClass {
getValue<T>(group: string, defaultVal: T): T {}
}
并且我尝试使用参数值来使此类的单元测试变得更容易(稍微做作来表达我的观点)
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)
此跟踪,因为 T 未在
Parameters<>
定义中定义。
有办法做到这一点吗?感觉我已经在每个可能的位置尝试了尖括号,但没有任何效果。
我知道我可以在调用返回未定义的函数时不定义 T,但随后我必须手动转换它,它看起来很混乱。
Parameters
这意味着你必须帮助打字稿在这里推断出正确的类型。 正如您所提到的,您可以通过手动转换参数类型来做到这一点。
class MyTestClass {
getValue<T>(group: string, defaultVal: T): T {
// Assume some logic here that returns T
return defaultVal;
}
}
// Wrapper function to call getValue with inferred types
function callGetValueWithInference<T>(
instance: MyTestClass,
...args: Parameters<MyTestClass['getValue']>
): T {
// TypeScript infers T based on the type of args[1]
return instance.getValue(...args);
}
// Usage
const service = new MyTestClass();
const argList1: Parameters<MyTestClass['getValue']> = ['group_1', 123];
// TypeScript now correctly infers T as number based on argList1[1]
const testValue1 = callGetValueWithInference(service, ...argList1);
console.log(testValue1); // Outputs: 123
它是如何工作的
原始代码:
包装功能: