Typescript kopiert keine zu erstellenden d.ts-Dateien
Vielleicht bin ich verwirrt, aber ich dachte, wenn ich declaration:true
meine Datei tsconfig.json hinzufüge , könnte ich meine *.d.ts
Dateien zusammen mit dem transpilierten Code und den d.ts
Dateien kopieren lassen ?
Z.B:
- src
- lib
- types.d.ts
- foo.ts
Ich würde erwarten, dass das Ergebnis von tsc ungefähr so aussieht:
- build
- lib
- types.d.ts
- foo.js
- foo.d.ts
Es scheint jedoch nicht möglich types.d.ts
zu sein, in mein Build-Verzeichnis kopiert zu werden.
Bietet Typoskript keinen Mechanismus zum Kopieren von .d.ts
Dateien? Oder habe ich nur irgendwo eine Fehlkonfiguration? (Ich habe zu diesem Zeitpunkt viele verschiedene Konfigurationen ausprobiert; nichts scheint zu funktionieren)
Antworten
Sie haben Recht - declaration:true
impliziert, dass nur für jede gegebene .ts
Datei tsc
eine entsprechende .d.ts
Ausgabedatei generiert und in das build
Verzeichnis kopiert wird (zusätzlich zu .js
und .map
falls zutreffend). So tsc
wird nicht kopieren Sie Ihre benutzerdefinierte types.d.ts
Datei in das Ausgabeverzeichnis.
Grundsätzlich werden .d.ts
Dateien als unantastbare Eingabe für den Compiler zur Typprüfung angesehen. Sie werden für keine Ausgabegenerierung verwendet, was auch bedeutet, dass sie nicht kopiert werden build
. Sie können mehr lesenhttps://github.com/Microsoft/TypeScript/issues/5112 über den Standpunkt der Betreuer:
Die von Ihnen verwendeten .d.ts-Dateien sind eine Eingabe für das Build-System, jedoch keine Ausgabe. Es ist durchaus sinnvoll, einige Typen aus einer .d.ts zu verwenden, aber Ihre Ausgabe verwendet diese Typen nicht, sodass es keinen Grund gibt, die eingegebenen .d.ts mit Ihren Build-Ergebnissen zu verteilen. [...] Es hört sich so an, als ob Sie einen Post-Build-Schritt in Ihrem Build-Tool benötigen, um die relevanten .d.ts-Dateien zu kopieren, wo immer Sie sie benötigen.
Die .d.ts-Dateien gelten als "Referenzen", die der Compiler nicht berührt, nicht verschiebt oder neu erstellt. Eine einfache Möglichkeit, sich die .d.ts-Dateien vorzustellen, besteht darin, dass sie zu Ihren .js-Dateien passen. Wenn Sie die .js-Dateien kopieren, sollten Sie die passenden .d.ts kopieren.
Lösung 1: Kopieren Sie d.ts-Dateien über einen manuellen Erstellungsschritt
Eine mögliche Lösung besteht darin, alle benötigten .d.ts
Dateien wie types.d.ts
manuell in einem Erstellungsschritt zu kopieren . Das konkrete Werkzeug ist bevorzugt und hängt von Ihrem Projekt und Build-Typ ab, unter anderem vom Betriebssystem. Dieses Tool sollte die Verzeichnisstruktur src
beim Kopieren von Dateien beibehalten build
, damit import
Typreferenzen weiterhin funktionieren. Um ein paar zu nennen:https://serverfault.com/questions/180853/how-to-copy-file-preserving-directory-path-in-linux(Shell) rsync
, robocopy
oder ein Plattform - unabhängiges NPM Paket wiehttps://www.npmjs.com/package/copyfiles::
"scripts": {
"copy-dts": "copyfiles -u 1 \"src/**/*.d.ts\" build"
}
Lösung 2: Umschreiben von d.ts-Dateien in die Erweiterung .ts
Benennen Sie Ihre .d.ts
Dateien in die .ts
Erweiterung um (oder integrieren Sie die Typen erneut in vorhandene .ts
Dateien), und tsc
sorgen Sie daher dafür, dass die Deklarationen in der Ausgabe ausgegeben werden. Leichter Nachteil: Sie haben keine vom Compiler erzwungene Trennung zwischen Typen und Implementierungscode ( d.ts
Dateien dürfen keinen Code enthalten). Der große Vorteil ist, dass Sie keinen zusätzlichen Build-Schritt benötigen.
Meiner Meinung nach ist letzteres der einfachste Ansatz, um eine öffentliche API zu generieren, z. B. für Ihr npm-Paket, während eine .d.ts
Datei einen Kandidaten für eine intern verwendete und gemeinsam genutzte Typdeklaration darstellen könnte.
Hoffentlich hilft das.