将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;
}
}