我试图使用泛型从单个包装器函数调用具有相应参数的对象的函数。
这是我想要达到的目标:
class Class1 {
method() {}
}
class Class2 {
method(x: string) {}
}
class Class 3 {
method(x: number, y: string) {}
}
// valid
wrapper(new Class1());
// valid
wrapper(new Class2(), 'hello');
// valid
wrapper(new Class3(), 10, 'hello');
// invalid
wrapper(new Class3(), '10', 'hello');
这是我的尝试:
function wrapper<
M extends { method: F },
F extends (..._: any[]) => any,
P extends Parameters<F>
>(m: M, ...p: P) {
m.method(...p);
}
这可以工作,但不能为参数p
提供类型安全。我能够传递对函数m.method
无效的参数。
由于编译器没有任何地方可以推断F
(其他类型参数不用作推断地点),它默认使用(...args: any[]) => any
的约束。这里只需要一个泛型类型参数:
function wrapper<
F extends (...args: any[]) => any,
>(m: { method: F }, ...p: Parameters<F>) {
// ^^^^^^^^^ inference point for F
m.method(...p);
}
游乐场