2017-07-31 1 views
1

私はEventEmmiterクラスを拡張するクラスを持っています。TypeScript宣言クラスが見つかりません

私はのIntelliSenseは、あなたが耳を傾けると自動でそれらを完了することができますさまざまなイベントを表示したいので、私はこの思い付いた:

//Imports from index.ts 
import { 
    CommandContext, 
    CommandErrorContext, 
    CommandHandler 
} from '../../'; 
import { EventEmitter } from 'events'; 

export class CommandHandler extends CommandHandlerEvents { 

    constructor() { 
     super(); 
    } 

} 

export declare class CommandHandlerEvents extends EventEmitter { 
    on(event: string, listener: Function): this; 
    on(event: 'failure', listener: (handler: CommandHandler, context: CommandErrorContext) => void): this; 
    on(event: 'success', listener: (handler: CommandHandler, context: CommandContext) => void): this; 

    once(event: string, listener: Function): this; 
    once(event: 'failure', listener: (handler: CommandHandler, context: CommandErrorContext) => void): this; 
    once(event: 'success', listener: (handler: CommandHandler, context: CommandContext) => void): this; 

    emit(event: string, args: any[]): boolean; 
    emit(event: 'failure', args: [CommandHandler, CommandErrorContext]): boolean; 
    emit(event: 'success', args: [CommandHandler, CommandContext]): boolean; 
} 

上記のコードは、私はそれが何をしたいまさに行い、私はCommandHandlerクラスのインスタンスを作成するとき、それは、このエラーがスローされます。

Uncaught ReferenceError: CommandHandlerEvents is not defined

は、私は同じことを行うためのインタフェースを使用している人々について読んだことがあるが、私はからCommandHandlerEventsを変更したときからinterfaceまでは、IntelliSenseに表示されなくなりました。望ましい結果の

例:image

+0

'EventEmitter'または' CommandErrorContext'または 'CommandContext'はどこにでも宣言されていますか? – recursive

+0

@再帰はい、私は詳細な説明のためにコード – DusterTheFirst

答えて

1

あなたclassdeclare、またはinterfaceを使用するには、あなただけのコンパイル時で型システムに物事を追加しています。 ランタイムに何も追加していません。あなたが見た場合、CommandHandlerEventsという名前のものはJavaScriptに出力されません。 declareキーワードは、あなたが話していることが実行時に存在することをコンパイラに指示します。これは、コードを実行するランタイム環境によって提供されるためです。

EventEmitterのすべての用途に、具体的なヒントがありますか?もしそうなら、あなたはmodule augmentationは、このタイプの情報を追加することができます。

import { EventEmitter } from 'events'; 
declare module 'events' { 
    interface EventEmitter { 
    on(event: string, listener: Function): this; 
    on(event: 'failure', listener: (handler: EventEmitter, context: CommandErrorContext) => void): this; 
    on(event: 'success', listener: (handler: EventEmitter, context: CommandContext) => void): this; 

    once(event: string, listener: Function): this; 
    once(event: 'failure', listener: (handler: EventEmitter, context: CommandErrorContext) => void): this; 
    once(event: 'success', listener: (handler: EventEmitter, context: CommandContext) => void): this; 

    emit(event: string, args: any[]): boolean; 
    emit(event: 'failure', args: [EventEmitter, CommandErrorContext]): boolean; 
    emit(event: 'success', args: [EventEmitter, CommandContext]): boolean; 
    } 
} 

const eventEmitter = new EventEmitter(); 
eventEmitter.once(...) // get hints 

をそれとも、本当にEventEmitterより具体的で、実行時にクラスCommandHandlerをしたいですか?あなたはdeclaration mergingでもそうすることができます:

import { EventEmitter } from 'events'; 
export class CommandHandler extends EventEmitter { } 
export interface CommandHandler { 
    on(event: string, listener: Function): this; 
    on(event: 'failure', listener: (handler: CommandHandler, context: CommandErrorContext) => void): this; 
    on(event: 'success', listener: (handler: CommandHandler, context: CommandContext) => void): this; 

    once(event: string, listener: Function): this; 
    once(event: 'failure', listener: (handler: CommandHandler, context: CommandErrorContext) => void): this; 
    once(event: 'success', listener: (handler: CommandHandler, context: CommandContext) => void): this; 

    emit(event: string, args: any[]): boolean; 
    emit(event: 'failure', args: [CommandHandler, CommandErrorContext]): boolean; 
    emit(event: 'success', args: [CommandHandler, CommandContext]): boolean; 
} 

const commandHandler = new CommandHandler(); 
commandHandler.once(...) // get hints 

希望に役立ちます。

+0

を更新します、これは非常に便利であり、私の問題を修正しました。 減速マージを使って目標を達成しました。 – DusterTheFirst

関連する問題