Typescript泛型:对象方法参数的类型安全泛型



我试图使用泛型从单个包装器函数调用具有相应参数的对象的函数。

这是我想要达到的目标:

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);
}

游乐场

相关内容

  • 没有找到相关文章

最新更新