我正试图编写一个通用方法,在实例列表上执行一个函数:
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.call
或Function.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