0

TypeScript コンパイラが次のエラー メッセージで確実に失敗するシナリオを見つけました。「内部エラー: プロパティ 'publicMembers' の値を取得できません: オブジェクトが null または未定義です」

ここに私の Repro.ts ファイルがあります:

interface Callback { (data: any): void; }

class EventSource1 {
    addEventHandler(callback: Callback): void { }
}

class EventSource2 {
    onSomeEvent: Callback;
}

export class Controller {
    constructor () {
        var eventSource = new EventSource1();
        // Commenting the next line will allow it to compile.
        eventSource.addEventHandler(msg => this.handleEventFromSource1(msg));
    }
    private handleEventFromSource1(signalState) {
        console.log('Handle event from source 1');
        var eventSource2 = new EventSource2();
        // Commenting the next line will allow it to compile.
        eventSource2.onSomeEvent = msg => this.handleEventFromSource2(msg);
    }
    private handleEventFromSource2(event) {
        console.log("Handling event from source 2.");
    }
}

これは、 TypeScript コンパイラのクラッシュ: publicMembers is null または undefinedの複製である可能性が非常に高いですが、再現はかなり単純なので、とにかく投稿してみようと思いました。

何かご意見は?

4

3 に答える 3

3

これをCodeplexのバグに追加しました。

それがあなたにとっても問題であることをまだ示していない場合は、そのバグに投票する必要があります。

あなたが正しいので、答えに追加することは他にあまりありません-これはコンパイラのバグです。修正を待つ必要があります。

于 2012-11-12T23:58:48.007 に答える
2

別の回避策。voidメソッドの戻り型を宣言します。

private handleEventFromSource1(signalState): void { ... }
private handleEventFromSource2(event): void { ... }
于 2012-11-13T07:22:08.160 に答える
1

価値のあることとしては、これまで (コンパイラのバグが修正されるまで) 問題に対して私が見つけた最善の回避策は、名前付きの Callback インターフェイスを避けることです。つまり、このコードは問題なく動作します。

class EventSource1 {
    addEventHandler(callback: { (data: any): void; }): void { }
}

class EventSource2 {
    onSomeEvent: { (data: any): void; };
}

class Controller {
    constructor () {
        var eventSource = new EventSource1();
        eventSource.addEventHandler(msg => this.handleEventFromSource1(msg));
    }
    private handleEventFromSource1(signalState) {
        console.log('Handle event from source 1');
        var eventSource2 = new EventSource2();
        eventSource2.onSomeEvent = msg => this.handleEventFromSource2(msg);
    }
    private handleEventFromSource2(event) {
        console.log("Handling event from source 2.");
    }
}
于 2012-11-13T01:18:31.547 に答える