1

我有一个使用ClearScript将 JavaScript 添加为扩展语言的应用程序。我已经开始在其他项目中使用 Typescript,并认为我也会在这个项目中使用它。

我的问题是我在 JavaScript 环境中暴露了相当多的 C# 对象/方法/属性。除了插入

// ts-ignore

在每个实例之上,有没有办法告诉 Typescript 某些符号是“已知的”?

能够具体说明这些函数的输入和输出会很好,这样 TS 可以在我没有正确使用它们时通知我。

如何声明外部符号?

例如,在这个切片中取出一个对象定义

  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();
  };

CSRestRequest是从 C# 端导入到 JavaScript 环境的符号,使用

 jSE.AddHostType("CSRestRequest", typeof(RestRequest)); 

RestRequest是 RestSharp 提供的符号。)

那么如何向 Typescript 声明它CSRestRequest是一个外部符号,new可以生成 RestSharp RestRequest 对象?

4

2 回答 2

1

您是否尝试过使用 .d.ts 文件?这些文件包含类型定义并被 ts 编译器用于类型检查。

你可以在这里找到信息:https ://www.typescriptlang.org/docs/handbook/declaration-files/introduction.html

例如,您可以创建 external.d.ts 文件并添加如下内容:

declare class CSRestRequest {
    // constructor(/* args */);

    // method(): void;
}

然后 ts 编译器应该选择 external.d.ts 文件并解析类型。

于 2019-07-30T08:44:34.050 回答
1

通常 typescript 使用声明来让编译器知道存在于运行时环境中但不是在 typescript 中创建的对象。根据您想要的类型安全级别,您可以将外部对象声明为any或更具体的类型。

使用any

declare const CSRestRequest: any;
declare const client: any;
function getIp(username: string, password: string) {
  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 {
  AddParameter(name: string, value: any): void;
};
declare const client: {
  Execute(req: CSRestRequest): {
    Content: string
  }
};
function getIp(username: string, password: string) {
  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();
};

于 2019-07-30T08:46:16.340 回答