Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/433.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
将C#委托翻译成打字脚本_C#_Javascript_Typescript - Fatal编程技术网

将C#委托翻译成打字脚本

将C#委托翻译成打字脚本,c#,javascript,typescript,C#,Javascript,Typescript,你能告诉我如何把这个翻译成TypeScript? 使用SharpKit.JavaScript namespace MyNamespace { [JsType(JsMode.Prototype)] public class JsEventArgs { } public delegate void JsEventHandler<in T>(object sender, T args) where T : JsEventArgs; publ

你能告诉我如何把这个翻译成
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);
}

我认为你需要停止用C#来思考,开始用打字脚本来思考

此代码:

module JsEvent {

    export class JsEventArgs {
    }

    public JsEventHandler: (sender: Object, args: any) => void;
    public JsEventHandler: (sender: Object, args: JsEventArgs) => void;
}
。。。尝试向模块添加两个属性,但仅允许在类(或接口)上添加属性

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.
}
我认为最接近代表的模式是这样的(抄袭自!):


。。。但是在TypeScript/JavaScript的世界中,我看不出这种模式通过直接调用
doSomething()
实现了什么。

我编写了一个类似.NET委托类的小类(它是为.NET中的事件隐式创建的)

导出接口IDelegate{
(发送方:任意,…参数:任意[]):无效;
}
导出类委托生成器{
私人被叫方:IDelegate[];
构造函数(){
this.callees=[];
}
调用(发送方:任意,…参数:任意[]){
for(var i=0;i=0;
}
添加(被调用方:IDelegate):DelegateBuilder{
如果(!被调用方)
归还这个;
如果(!this.contains(被调用方))
this.callees.push(被调用方);
归还这个;
}
删除(被调用方:IDelegate):DelegateBuilder{
如果(!被调用方)
归还这个;
var index=this.callees.indexOf(被调用方);
如果(索引>=0)
这个被调用者拼接(索引,1);
归还这个;
}
toDelegate():IDelegate{
return(sender:any,…parameters:any[])=>this.invoke(sender,parameters);
}
}

我认为这是对所讨论的代码的近似翻译。但是,这并没有解决事件处理问题,这一点已在中介绍

modulemynamespace
{
导出类JsEventArgs
{
}
导出接口JsEventHandler{
(发送方:任何,参数:T):无效;
}
导出接口JsEventHandler{
(发送方:any,args:JsEventArgs):void;
}
}

我不知道你想做什么。SharpKit与TypeScript有什么关系?我正在将一个C#应用程序翻译成TypeScript。我想创建一个与C#代码中的事件一样工作的事件。您在上面尝试的TypeScript有什么问题?这不是因为它们是公共的,而是因为您无法向模块添加属性。问题一点也不清楚。JsEventHandler、JsEventArgs和JsMode——有人怎么猜到它们的用途?您需要清楚地定义您想要实现的目标,而不是在没有任何解释的情况下给出原始源代码。在委托中封装通用调用签名有助于重用和可读性。
var div: HTMLDivElement = new HTMLDivElement();
div.onclick = (e: MouseEvent) => {
    // Do something here.
};
div.onclick = doSomething;
function doSomething(e:MouseEvent):void{
    // Do something here.
}
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);
        }
    }
}
module MyNamespace
{
    export class JsEventArgs
    {
    }

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

    export interface JsEventHandler {
        (sender: any, args: JsEventArgs): void;
    }
}