3

TypeScriptとSignalRを一緒に使用しており、生成されたSignalRクラスの静的型を定義しようとしています。そして、私がこのようなことをすると、それは機能します:

///<reference path="../Scripts/jquery-1.8.d.ts" />
///<reference path="../Scripts/signalr-1.0.d.ts" />

interface SignalR {
    roomHub: Service.RoomHub;
}

module Service {
        export var roomHub = $.connection.roomHub;
        export interface RoomHub { }
}

そしてもちろん$.connection、タイプSignalRは「signalr-1.0.d.ts」ファイルで定義され、上記のファイルで拡張されています。

ただし、他のファイルからモジュールを参照できる必要があるServiceため、モジュールとインターフェイスの両方に「export」キーワードを追加する必要があります。

///<reference path="../Scripts/jquery-1.8.d.ts" />
///<reference path="../Scripts/signalr-1.0.d.ts" />

export interface SignalR {
    roomHub: Service.RoomHub;
}

export module Service {
    // Error here: "The property 'roomHub' does not exist on type SignalR."
    export var roomHub = $.connection.roomHub;
    export interface RoomHub { }
}

ただし、これを行うと、の下$.connection.roomHubに小さな赤い波線が表示され、コンパイラは「プロパティ'roomHub'はSignalR型に存在しません」というエラーを返します。

私は確かにTypeScriptについてすべてを理解しているわけではありませんが、それは私には正しくないようです。コンパイラのバグに遭遇しましたか?または、これを行う別の方法はありますか?

4

3 に答える 3

6

回避策を見つけることができました。インターフェイスを別のファイルに取り出しました。

// File: ISignalR.ts
interface SignalR {
    roomHub: RoomHub;
}

interface RoomHub {
}

次に、サービスファイルでそのファイルを参照しました

///<reference path="../Scripts/jquery-1.8.d.ts" />
///<reference path="../Scripts/signalr-1.0.d.ts" />
///<reference path="ISignalR.ts" />

export module Service {
    export var roomHub = $.connection.roomHub;
}

そして、それは奇妙なことに十分に機能します。それがコンパイラのバグなのか、それとも私が誤解し続けているものなのかはわかりませんが、AMDモジュールのサポートに関連するいくつかの微妙なセマンティックの変更と明らかに関係があります。TypeScriptやRequireJSモジュールを私より少し上手くやっている人からもっと多くの説明を聞きたいです。

于 2012-11-26T22:39:27.467 に答える
2

SignalRを接続し、使用する方法は複数あり、createHubProxyTypeScriptinvokeに適しています。

export class FrameworkHub {

    private connection: HubConnection;
    private proxy: HubProxy;

    Init(): void {
        this.Connected = false;
        this.connection = $.hubConnection();
        this.connection.logging = true;
        // Binding with createHubProxy means you can use a string name, so no need to add dynamic properties to the hub
        this.proxy = this.connection.createHubProxy("MyHubName"); 
        this.wireEventListeners();
        this.initializeConnection();
    }

    // Binding with proxy.on means you can use a string name for the function, so no need to add dynamic properties to the hub.
    wireEventListeners(): void {
        this.proxy.on("HandleFrameworkMessage", (message: IFrameworkMessage) => {
            console.log("HandleFrameworkMessage: " + message.AccountID + " - " + message.ArmID);
            // Do something to handle the message here.
        });
    }

    initializeConnection(): void {
        //console.log("Framework Hub initializeConnection");
        var that = this;
        //Again, using invoke means passing a string argument.
        this.connection.start().done(() => {
            that.proxy.invoke("Connect", this.AccountID, this.ArmID).done((response:FrameworkHubResponse) => {
                //console.log("FHR: " + response.Success + " - " + response.Message);
                if (response.Success) {
                    // Do something.
                }
                else {
                    // Try again. Would be better with some kind of exponential back-off.
                    setTimeout(that.initializeConnection, 500);
                }
            });
        });
    }
}

これは実際のコードから切り取った少し大まかな例ですが、SignalRを使用するための最良のTS方法であることがわかりました。この種の接続のドキュメントは次のとおりです:https ://github.com/SignalR/SignalR/wiki/SignalR-JS-Client-Hubs-%28No-Proxy%29-ドキュメントが常にペースを維持しているとは限らないため、注意してください最近の変更。

于 2012-11-27T11:47:00.600 に答える
2

SignalRオブジェクトに実際のメンバーがある場合は、代わりに構文を使用しますdeclare moduleinterface宣言は、(現存するオブジェクトを記述するのではなく)型のメンバーのみを記述します。

///<reference path="../Scripts/jquery-1.8.d.ts" />
///<reference path="../Scripts/signalr-1.0.d.ts" />

declare module SignalR {
    var roomHub: Service.RoomHub;
}

export module Service {
    // Good now
    export var roomHub = $.connection.roomHub;
    export interface RoomHub { }
}
于 2012-11-26T22:02:44.220 に答える