以下是我如何可靠地重写 vanilla JS 中的方法,而不关心名称或参数数量或返回值:
import EventEmitter from 'events'
// console.log event + arguments every time this emitter emits anything.
// Just an example.
class LogEmitter extends EventEmitter {
emit(...args) {
console.log('emit', ...args)
return super.emit(...args)
}
}
但在 TypeScript 中,我听到了抱怨:
import { EventEmitter } from 'events'
class LogEmitter extends EventEmitter {
emit(...args) { // Rest Parameter 'args' implicitly has an any[] type
console.log('emit', ...args)
return super.emit(...args) // Expected at least 1 arguments, but got 0 or more.
}
}
我不知道如何告诉 TypeScript 这没问题。我不想知道有关我要重写的方法的签名的任何信息,只需打印您传递的任何参数即可。意味着如果/当超类签名发生更改时,我不必更新我的签名,理想情况下,我将有一种方法来键入它,该方法适用于我重写的所有方法,也许有一个例外,告诉它要复制哪个方法名称签名来自.
就像是:
的类型...args
应该是任何Parameters
are to super.emit
但我的新手尝试这不是有效的语法:
import { EventEmitter } from 'events'
class LogEmitter extends EventEmitter {
emit(...args: Parameters<super.emit>) { // 'super' can only be referenced in members of derived classes or object literal expressions.
console.log('emit', ...args)
return super.emit(...args)
}
}
我的解决方法是any
所需的第一个参数:
import { EventEmitter } from 'events'
class LogEmitter extends EventEmitter {
emit(type: any, ...args: any[]) {
console.log('emit', type, ...args)
return super.emit(type, ...args)
}
}
但我认为这更像是修补症状,因为现在此类报告的签名不太准确。我觉得有一个更好的解决方案可以提供的正确签名emit
自动,无需我复制它super.emit
.
我怎样才能在不知道的情况下完美地输入这个内容anything关于签名super.emit
?