--
--

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

Tag:

27
2017

TypeScriptでEventEmitterイベントの型を指定する方法

CATEGORYJavaScript
最近人のソースを見てようやく知ったのだが、JavaScriptでよく見かけるイベント( on('close', ~) とか)は EventEmitter なるものを継承して実装するものだそうで、、、自前でやってたわ(汗

で、早速TypeScriptでも使おうとしたものの、イベント引数の型の指定の方法に難儀したので、その方法を書いておく。

まず大前提として、TypeScriptには「Overload on constants」なる、第1引数の値に応じて第2引数以降の型を定義する機能がある模様。
なので、on というメソッドに対して、close やら error やらのイベントごとに型を切り替えることは特に問題なくできる。

実際、JavaScriptのコードに .d.ts で型を付ける場合は特に何も考える必要はなく、普通にこんな感じに型を宣言してやればよい。
on(event: 'error', cb: (err: Error) => void): this;
on(event: 'close', cb: (code: number, message: string) => void): this;
が困ったのはこれを普通のクラス(class Xxx extends EventEmitter なもの)に書く方法。↑をそのまま持ってきても、親クラスの実装を認識せず、実装がないとコンパイルエラーになってしまう(TypeScript 2.1現在)。

で、どうしたかというと、凄く力技ながら↓のように書いて解決した(実際のコードはこれとか)。
on(event: 'error', cb: (err: Error) => void): this;
on(event: 'close', cb: (code: number, message: string) => void): this;
on(event: string | symbol, listener: Function): this {
return super.on(event, listener);
}
うん凄くイケてない。だが、とりあえず問題は解決した。手間も大したことはない。だが微妙。…これで別に困らないけど、もっと良い解決策があれば教えてくださいm(__)m
スポンサーサイト

Tag: JavaScript TypeScript

0 Comments

Leave a comment

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。