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?
Wie produzieren Sie eine .d.ts „Typisierungen“ Definitionsdatei aus einer vorhandenen JavaScript-Bibliothek?
quelle vom benutzer Hotrodmonkey
In anderen Sprachen...
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.
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.
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.
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.
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
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.
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
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)