Typescript kopiert keine zu erstellenden d.ts-Dateien

May 07 2019

Vielleicht bin ich verwirrt, aber ich dachte, wenn ich declaration:truemeine Datei tsconfig.json hinzufüge , könnte ich meine *.d.tsDateien zusammen mit dem transpilierten Code und den d.tsDateien 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.tszu sein, in mein Build-Verzeichnis kopiert zu werden.

Bietet Typoskript keinen Mechanismus zum Kopieren von .d.tsDateien? Oder habe ich nur irgendwo eine Fehlkonfiguration? (Ich habe zu diesem Zeitpunkt viele verschiedene Konfigurationen ausprobiert; nichts scheint zu funktionieren)

Antworten

25 ford04 Jun 04 2019 at 08:43

Sie haben Recht - declaration:trueimpliziert, dass nur für jede gegebene .tsDatei tsceine entsprechende .d.tsAusgabedatei generiert und in das buildVerzeichnis kopiert wird (zusätzlich zu .jsund .mapfalls zutreffend). So tscwird nicht kopieren Sie Ihre benutzerdefinierte types.d.tsDatei in das Ausgabeverzeichnis.

Grundsätzlich werden .d.tsDateien 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.tsDateien wie types.d.tsmanuell 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 srcbeim Kopieren von Dateien beibehalten build, damit importTypreferenzen weiterhin funktionieren. Um ein paar zu nennen:https://serverfault.com/questions/180853/how-to-copy-file-preserving-directory-path-in-linux(Shell) rsync, robocopyoder 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.tsDateien in die .tsErweiterung um (oder integrieren Sie die Typen erneut in vorhandene .tsDateien), und tscsorgen 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.tsDateien 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.tsDatei einen Kandidaten für eine intern verwendete und gemeinsam genutzte Typdeklaration darstellen könnte.

Hoffentlich hilft das.