我尝试使用泛型来调用一个对象的函数,并从一个 Package 器函数中调用相应的参数。
以下是我正在努力实现的目标:
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
。
1条答案
按热度按时间fjaof16o1#
由于编译器没有任何地方可以推断
F
(其他类型参数不用作推断站点),因此它默认为(...args: any[]) => any
的约束。在这里,您实际上只需要1个泛型类型参数:Playground