我们使用ClearScript扩展我们的应用程序。我们使用ClearScript的AddHostType和AddHostObject方法将各种C#对象公开到JavaScript中。
最近,我们开始在我们的Google Apps脚本项目中使用Typescript,并认为也可以使用它来管理我们的ClearScript脚本。
这被证明是一个有趣的经历。我们知道诸如external.d.ts
之类的东西,并且已经开始编写一个代码来处理我们从C#端注入的各种符号。
我们已经能够解决某些问题。例如,在这段代码中
function SchTasks(instruction:string) {
var proc = CSProcess.Start("C:\\Windows\\System32\\schtasks.exe", instruction);
return proc;
}
此声明似乎有效
declare namespace CSProcess {
function Start(a:string, b:string): any;
}
同样,带有此方块
that.getMyIP = function () {
var request = new CSRestRequest();
request.AddParameter("user", username);
request.AddParameter("pass", password);
request.AddParameter("command", "getmyip");
var response = client.Execute(request);
return response.Content.trim();
};
此声明似乎有效
declare class CSRestRequest {
constructor (str?:any) ;
AddParameter(a:string, b:string) : any;
}
目前困扰我们的是如何声明以下内容。该符号称为CSSettings
,它是Dictionary<string,object>
的一个实例,因此它有一些挂起它的方法,例如.ContainsKey
。声明此的最佳方法是什么?它无法new
进行编辑,因此它不是带有构造函数的类,但是它确实具有类似类的方法。
var taskName = "\XChecker\M_XChecker_" + (function () {
if (CSSettings.ContainsKey("/TEST")) {
return "TEST";
}
if (CSSettings.ContainsKey("/PRODUCTION")) {
return "PRODUCTION";
}
return "UNKNOWN";
}
()) + "_" + CSSettings("/TASKRULESETGROUPLUTFKS") + "_" + CSSettings("/INSTANCENUMBER") + "_" + CSSettings("/INSTANCECOLUMN");
LATER
以下内容似乎起作用。奇怪的是,VSCode没有报告符号名称冲突。 CSSetting
真的可以同时成为函数和名称空间吗?显然是的。
declare function CSSettings(s:string):any;
declare namespace CSSettings {
function ContainsKey(s:string):boolean;
}
答案 0 :(得分:1)
声明您的字典类。然后使用这种类型的变量CSSettings
declare class IDictionary {
constructor();
public ContainsKey(key: string): boolean;
}
declare const CSSettings: IDictionary;
CSSettings.ContainsKey('key');
//编辑
那么要创建2种类型并将其合并呢?这样您就可以将CSSettings用作函数甚至用作对象
declare type functionType = (key: string) => boolean;
declare const CSSettings: functionType & { ContainsKey: (key: string) => boolean };
CSSettings.prototype.ContainsKey = 1;
CSSettings('key');
CSSettings.ContainsKey('key');