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

cgyqldqp  于 2023-04-07  发布在  TypeScript
关注(0)|答案(1)|浏览(150)

我尝试使用泛型来调用一个对象的函数,并从一个 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

fjaof16o

fjaof16o1#

由于编译器没有任何地方可以推断F(其他类型参数不用作推断站点),因此它默认为(...args: any[]) => any的约束。在这里,您实际上只需要1个泛型类型参数:

function wrapper<
  F extends (...args: any[]) => any,
>(m: { method: F }, ...p: Parameters<F>) {
//     ^^^^^^^^^ inference point for F
  m.method(...p);
}

Playground

相关问题