Wie produzieren Sie eine .d.ts „Typisierungen“ Definitionsdatei aus einer vorhandenen JavaScript-Bibliothek?

stimmen
127

Ich benutze eine Menge von Bibliotheken sowohl meine eigene und 3rd-Party. Ich sehe die „Typisierungen“ Verzeichnis einige für JQuery und WinRT enthält ... aber wie werden sie erstellt?

Veröffentlicht am 02/10/2012 um 10:29
quelle vom benutzer
In anderen Sprachen...                            


8 antworten

stimmen
168

Es gibt ein paar Möglichkeiten für Sie auf der Bibliothek in Frage abhängig, wie es geschrieben, und welches Maß an Genauigkeit, die Sie suchen. Lassen Sie uns die Optionen überprüfen, in etwa der Reihenfolge der Wünschbarkeit absteigend.

Vielleicht Es ist bereits vorhanden

Überprüfen Sie immer DefinitelyTyped ( https://github.com/DefinitelyTyped/DefinitelyTyped ) aus . Dies ist eine Community - Repo voller buchstäblich Tausende von .d.ts Dateien und es ist sehr wahrscheinlich , dass das , was Sie verwenden schon da ist. Sie sollten auch prüfen TypeSearch ( https://microsoft.github.io/TypeSearch/ ) , die für NPM veröffentlichten .d.ts Dateien eine Suchmaschine ist; dies wird etwas mehr Definitionen als DefinitelyTyped haben. Einige Module sind lieferbar auch ihre eigenen Definitionen im Rahmen ihrer NPM Verteilung, so auch sehen , ob das der Fall ist , bevor Sie Ihre eigenen zu schreiben.

Vielleicht nicht One Sie brauchen

Typoskript unterstützt nun die --allowJsFlagge und wird mehr JS-basierte Schlussfolgerungen in Js - Dateien machen. Sie können versuchen , die JS - Datei in Ihrer Zusammenstellung zusammen mit der darunteren --allowJsEinstellung zu sehen , ob diese Ihnen gut genug , um Typinformationen gibt. Typoskript werden Dinge wie ES5-Style - Klassen und JSDoc Kommentare in diesen Dateien erkennen, aber bekommen gestolpert, wenn die Bibliothek selbst in einer seltsamen Art und Weise initialisiert.

Erste Schritte mit --allowJs

Wenn --allowJsSie anständige Ergebnisse gab , und Sie wollen eine bessere Definition schreiben Datei selbst, können Sie kombinieren --allowJsmit --declarationTyposkript der „best guess“ auf die Arten der Bibliothek zu sehen. Dies wird Ihnen einen angemessenen Ausgangspunkt und kann so gut wie eine Hand-Autor Datei sein , wenn die JSDoc Kommentare sind gut geschrieben und der Compiler konnte sie finden.

Erste Schritte mit dts-gen

Wenn --allowJsnicht funktioniert, sollten Sie dts-gen (verwenden https://github.com/Microsoft/dts-gen ) einen Ausgangspunkt zu bekommen. Dieses Tool verwendet die Laufzeit Form des Objekts genau alle verfügbaren Eigenschaften aufzuzählen. Auf der positiven Seite neigt diese sehr genau zu sein, aber das Tool noch nicht unterstützt die JSDoc Kommentare Schaben weitere Typen zu füllen. Sie führen dies wie folgt:

npm install -g dts-gen
dts-gen -m <your-module>

Dies wird erzeugt your-module.d.tsim aktuellen Ordner.

Drücke die Schlummertaste

Wenn Sie nur es später tun wollen und gehen, ohne Typen für eine Weile in Typoskript 2.0 können Sie jetzt schreiben

declare module "foo";

die Sie lassen importdas "foo"Modul mit Typ any. Wenn Sie eine globale haben Sie mit später beschäftigen möchten, schreiben Sie einfach

declare const foo: any;

die Ihnen eine fooVariable.

Beantwortet am 02/10/2012 um 18:11
quelle vom benutzer

stimmen
25

Sie können entweder tsc --declaration fileName.tswie Ryan beschreibt, oder Sie können festlegen , declaration: trueunter compilerOptionsin Ihrem tsconfig.jsonvorausgesetzt , Sie haben bereits ein tsconfig.jsonunter Ihrem Projekt.

Beantwortet am 04/08/2016 um 00:54
quelle vom benutzer

stimmen
13

Der beste Weg , damit umzugehen (wenn eine Deklarationsdatei auf nicht verfügbar ist DefinitelyTyped ) ist Erklärungen zu schreiben , nur für die Dinge , die Sie verwenden , anstatt die gesamte Bibliothek. Dadurch verringert sich die Arbeit viel - und zusätzlich der Compiler ist es durch beschweren sich über fehlende Methoden , um zu helfen.

Beantwortet am 19/10/2015 um 09:08
quelle vom benutzer

stimmen
10

Als Ryan sagt, hat die tsc Compiler einen Schalter , --declarationder eine erzeugt .d.tsDatei aus einer .tsDatei. Beachten Sie auch , dass (abgesehen von Bugs) Typoskript soll der Lage sein , Javascript zu erstellen, so dass Sie Javascript - Code vorhandene an den tsc Compiler passieren kann.

Beantwortet am 03/10/2012 um 00:02
quelle vom benutzer

stimmen
7

wie beschrieben in http://channel9.msdn.com/posts/Anders-Hejlsberg-Steve-Lucco-and-Luke-Hoban-Inside-TypeScript bei 00.33.52 hatten sie ein Tool zum Konvertieren WebIDL und WinRT gebaut Metadaten in Typoskript d.ts

Beantwortet am 02/10/2012 um 21:24
quelle vom benutzer

stimmen
2

Hier einige Powershell , die eine einzelne Typoskript Definitionsdatei eine Bibliothek erstellt , die mehrere enthält *.jsDateien mit modernen JavaScript.

Erstens ändern sich alle Erweiterungen .ts.

Get-ChildItem | foreach { Rename-Item $_ $_.Name.Replace(".js", ".ts") }

Zweitens verwenden, die Mitschrift Compiler-Definitionsdateien zu erzeugen. Es wird eine Reihe von Compiler-Fehler sein, aber wir können diejenigen ignorieren.

Get-ChildItem | foreach { tsc $_.Name  }

Schließlich vereint alle *.d.tsDateien in eine index.d.ts, die Entfernung von importAnweisungen und das Entfernen defaultvon jeder Export - Anweisung.

Remove-Item index.d.ts; 

Get-ChildItem -Path *.d.ts -Exclude "Index.d.ts" | `
  foreach { Get-Content $_ } | `
  where { !$_.ToString().StartsWith("import") } | `
  foreach { $_.Replace("export default", "export") } | `
  foreach { Add-Content index.d.ts $_ }

Dieser endet mit einer einzigen nutzbaren index.d.tsDatei , die viele der Definitionen enthält.

Beantwortet am 19/08/2016 um 22:44
quelle vom benutzer

stimmen
2

Ich würde nach einer vorhandenen Abbildung Ihrer 3rd-Party-JS-Bibliotheken, das Script # oder SharpKit unterstützen. Ausführliche Informationen über diese C # Cross-Compiler .js das Problem, das Sie jetzt stehen haben konfrontiert und haben möglicherweise eine Open-Source-Programm zu scannen Ihre 3rd-Party-lib und konvertieren in Skelett C # -Klassen veröffentlicht. Wenn ja das Scanner-Programm hacken, um Typoskript anstelle von C # zu erzeugen.

dass Andernfalls könnte eine C # öffentliche Schnittstelle für 3rd-Party-lib in Typoskript Definitionen übersetzen einfacher sein als das gleiche zu tun, indem Sie die Quelle JavaScript zu lesen.

Mein besonderes Interesse ist ExtJS RIA Rahmen des Sencha und ich weiß, es wurden Projekte veröffentlicht eine C # Interpretation für Script # oder SharpKit zu erzeugen

Beantwortet am 04/10/2012 um 18:37
quelle vom benutzer

stimmen
0

Wenn Sie Ihre eigene Bibliothek erstellen, können Sie erstellen können *.d.tsDateien durch die Verwendung von tsc(Typoskript Compiler) Befehl wie folgt: (vorausgesetzt , Sie bauen Ihre Bibliothek in den dist/libOrdner)

tsc -d --declarationDir dist/lib --declarationMap --emitDeclarationOnly
  • -d( --declaration): Erzeugt die *.d.tsDateien
  • --declarationDir dist/lib: Ausgabeverzeichnis für generierte Meldungsdateien.
  • --declarationMapErzeugt eine sourcemap für jede entsprechende‘.d.ts' file:.
  • --emitDeclarationOnly: Nur ‚.d.ts' Deklarationsdateien emittieren. (Kein kompilierten JS)

(siehe die Dokumente für alle Kommandozeilen - Compiler - Optionen)

Oder zum Beispiel in der package.json:

"scripts": {
    "build:types": "tsc -d --declarationDir dist/lib --declarationMap --emitDeclarationOnly",
}

und dann ausgeführt wird : yarn build:types(oder npm run build:types)

Beantwortet am 23/09/2019 um 19:24
quelle vom benutzer

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more