javascript - Hur man definierar objekt som ska ignoreras i Typescript


Jag har en applikation som använder ClearScript för att lägga till JavaScript som ett extensionsspråk. Jag har börjat använda Typescript i andra projekt och tänkte att jag skulle använda det i detta också.

Mitt problem är att jag har exponerat ett ganska stort antal C#-objekt/metoder/egenskaper till JavaScript-miljön. Förutom att infoga

// ts-ignore

över varje instans, finns det ett sätt att tala om för Typescript att vissa symboler är "kända"?

Det vore trevligt att kunna vara specifik om input och output av dessa funktioner så att TS kunde meddela mig när jag inte använder dem på rätt sätt.

Hur deklarerar jag externa symboler?

Till exempel, i detta utdrag ur en objektsdefinition

  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 är en symbol som importeras till JavaScript-miljön från C#-sidan, med hjälp av

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

(RestRequest är en symbol som tillhandahålls av RestSharp.)

Så hur deklarerar jag för Typescript att CSRestRequest är en extern symbol som man new:ar för att skapa ett RestSharp RestRequest-objekt?

Svar #1

Har du försökt att använda .d.ts-filer? Dessa filer innehåller typdefinitioner och används av ts-kompilatorn för typkontroll.

Du kan hitta information här: https://www.typescriptlang.org/docs/handbook/declaration-files/introduction.html

Till exempel kan du skapa en fil som heter external.d.ts och lägga till något liknande:

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

    // method(): void;
}

Då ska ts-kompilatorn plocka upp filen external.d.ts och lösa typen.

Svar #2

Generellt använder TypeScript deklarationer för att låta kompilatorn veta om objekt som finns i runtime-miljön men som inte skapats i TypeScript. Beroende på nivån av typ-säkerhet du vill ha kan du bara deklarera det externa objektet som any eller som en mer specifik typ.

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

Deklarera en klass (mer specifik):

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