使用参数调用对象的成员

Jaf*_*ake 32 typescript

function whatever(object, methodName, args) {
  return object[methodName](...args);
}
Run Code Online (Sandbox Code Playgroud)

可以输入以上内容,以便强制执行以下操作:

  • methodName是关键object.
  • object[methodName]是可调用的,它的args是...args.
  • 返回类型whatever(object, methodName, args)是返回类型object[methodName](...args).

我能找到的最接近的是定义function.apply,但它与上面的不完全相同.

ric*_*ilv 30

认为这样做的诀窍:

function callMethodWithArgs<
  M extends keyof T,
  T extends { [m in M]: (...args: Array<any>) => any },
  F extends T[M]
>(obj: T, methodName: M, args: Parameters<F>) {
  return obj[methodName](...args) as ReturnType<F>;
}
Run Code Online (Sandbox Code Playgroud)

但需要TS 3!

  • 我也应该说:谢谢!TIL我学习`Parameters <F>`,`ReturnType <F>`,以及在M`中使用`m. (3认同)
  • @BenKolyaMansley哈哈并没什么大不了的 (3认同)
  • 一条评论:`<M扩展了T的键,...`确保`methodName`实际上是`obj`的一个键:) (2认同)