定义泛型方法调用程序-typescript问题



我正试图编写一个通用方法,在实例列表上执行一个函数:

private exec<Method extends keyof Klass>(
method: Method,
...params: Parameters<Klass[Method]>
) {
this.listeners.map((listener) => listener[method](...params));
}

我在...params:上收到打字错误

Expected 1-2 arguments, but got 0 or more.

(Klass的每种方法都接受0-2个参数(。

我该如何解决这个问题?

如果您试图将方法调用为listener[method](...params),它将丢失对this的跟踪。为了避免这种情况,您可以使用Function.prototype.callFunction.prototype.apply,大致如下:

this.listeners.map((l) => (l[method] as (...ps: Parameters<Klass[Method]>) => void).apply(l, params))

完整示例:

class Klass {
constructor(private readonly v: number) { }
foo(a: string) { console.log("foo", this.v, a) }
bar(n: number) { console.log("bar", this.v, n) }
}
const listeners = [
new Klass(42),
new Klass(58)
]
function exec<Method extends keyof Klass>(
method: Method,
...params: Parameters<Klass[Method]>
) {
listeners.map((listener) =>
(listener[method] as (...ps: Parameters<Klass[Method]>) => void).apply(listener, params));
}
exec('foo', 'a string')
// foo 42 a string
// foo 58 a string
exec('bar', 10101010)
// bar 42 10101010
// bar 58 10101010

最新更新