0

これを に訳す方法を教えてくださいTypeScript。SharpKit.JavaScript の使用;

namespace MyNamespace
{
    [JsType(JsMode.Prototype)]
    public class JsEventArgs
    {
    }

    public delegate void JsEventHandler<in T>(object sender, T args) where T : JsEventArgs;
    public delegate void JsEventHandler(object sender, JsEventArgs args);
}

そして、他のクラスでの使用法:

public event JsEventHandler<LayerVisivilityEventArgs> Changed;

私はそれを試しました:

module JsEvent {

    export class JsEventArgs {
    }

    public JsEventHandler: (sender: Object, args: any) => void;
    public JsEventHandler: (sender: Object, args: JsEventArgs) => void;
}
4

3 に答える 3

6

.NET Delegate クラス (.NET のイベント用に暗黙的に作成される) のように動作する小さなクラスを作成しました。

export interface IDelegate {
    (sender: any, ...parameters: any[]): void;
}

export class DelegateBuilder {
    private callees: IDelegate[];

    constructor() {
        this.callees = [];
    }

    invoke(sender: any, ...parameters: any[]) {
        for (var i = 0; i < this.callees.length; i++) {
            var callee = this.callees[i];
            if (caller)
                callee(sender, parameters);
        }
    }

    contains(callee: IDelegate) : bool {
        if (!callee)
            return false;

        return this.callees.indexOf(callee) >= 0;
    }

    add(callee: IDelegate): DelegateBuilder {
        if (!callee)
            return this;

        if (!this.contains(callee))
            this.callees.push(callee);

        return this;
    }

    remove(callee: IDelegate): DelegateBuilder {
        if (!callee)
            return this;

        var index = this.callees.indexOf(callee);
        if (index >= 0)
            this.callees.splice(index, 1);

        return this;
    }

    toDelegate() : IDelegate {
        return (sender: any, ...parameters: any[]) => this.invoke(sender, parameters);
    }
}
于 2013-03-28T11:03:14.997 に答える
5

C#で考えるのをやめて、TypeScriptで考え始める必要があると思います。

このコード:

module JsEvent {

    export class JsEventArgs {
    }

    public JsEventHandler: (sender: Object, args: any) => void;
    public JsEventHandler: (sender: Object, args: JsEventArgs) => void;
}

...モジュールに2つのプロパティを追加しようとしますが、プロパティはクラス(またはインターフェイス)でのみ許可されます。

TypeScriptは実際にはデリゲートを使用しません-次のようにイベントを(たとえば、JQueryで)接続できます。

$('selector').click((e:JQueryEventObject) => {
     // Do something here.
});

...または、JQueryを回避する:

var div: HTMLDivElement = new HTMLDivElement();
div.onclick = (e: MouseEvent) => {
    // Do something here.
};

...または、無名関数なし:

div.onclick = doSomething;
function doSomething(e:MouseEvent):void{
    // Do something here.
}

デリゲートに最も近いパターンは次のようなものだと思います(http://forum.unity3d.com/threads/9679-Javascript-Delegatesから引用!):

module JSEvents {
    class JSEventClass {

        public delegate:(e:string) => any;

        constructor() => {
            this.delegate = this.doSomething;
            this.delegate("Hello, Delegate World");
        }

        public doSomething(e: string): any {
            console.log("Doing Something: " + e);
        }
    }
}

doSomething()...しかし、TypeScript / JavaScriptの世界では、直接呼び出すだけでこのパターンが何を達成するのかわかりません。

于 2012-11-30T14:39:50.127 に答える
0

これは問題のコードに近い翻訳だと思います。ただし、これは別の回答で既にカバーされているイベント処理には対応していません。

module MyNamespace
{
    export class JsEventArgs
    {
    }

    export interface JsEventHandler<T extends JsEventArgs> {
        (sender: any, args: T): void;
    }

    export interface JsEventHandler {
        (sender: any, args: JsEventArgs): void;
    }
}
于 2013-12-23T00:38:19.433 に答える