Typescript non copia i file d.ts da compilare

May 07 2019

Quindi forse sono confuso, ma ho pensato che se avessi aggiunto declaration:trueal mio tsconfig.json avrei potuto fare in modo che tsc copiasse i miei *.d.tsfile, insieme al codice trasferito e ai suoi d.tsfile?

PER ESEMPIO:

- src
 - lib
   - types.d.ts
   - foo.ts

Mi aspetto che il risultato di tsc sia qualcosa del tipo:

- build
 - lib
   - types.d.ts
   - foo.js
   - foo.d.ts

Tuttavia, non riesco types.d.tsa essere copiato nella mia directory di build.

Il dattiloscritto non fornisce alcun meccanismo per copiare i .d.tsfile? O ho solo una configurazione errata da qualche parte? (Ho provato molte configurazioni diverse a questo punto; niente sembra funzionare)

Risposte

25 ford04 Jun 04 2019 at 08:43

Hai ragione - declaration:trueimplica che solo per ogni dato .tsfile tscgenera e copia un .d.tsfile di output corrispondente nella builddirectory (in aggiunta a .jse .mapse applicabile). Quindi tscnon copierà il tuo types.d.tsfile personalizzato nella directory di output.

Fondamentalmente i .d.tsfile sono visti come input intoccabili per il compilatore per eseguire controlli di tipo. Non vengono utilizzati per alcuna generazione di output, il che significa anche che non vengono copiati build. Puoi leggere di piùhttps://github.com/Microsoft/TypeScript/issues/5112 sul punto di vista dei manutentori:

I file .d.ts che usi sono un input per il sistema di compilazione ma non un output. È perfettamente ragionevole consumare alcuni tipi da un .d.ts ma fare in modo che l'output non utilizzi quei tipi, quindi non ci sarebbe motivo di distribuire l'input .d.ts con i risultati della compilazione. [...] Sembra che tu voglia un passaggio post-compilazione nel tuo strumento di compilazione per copiare i file .d.ts pertinenti ovunque ti serva.

I file .d.ts sono considerati "riferimenti", il compilatore non li toccherà, non li sposterà o li ricrea. Un modo semplice per pensare ai file .d.ts è che vanno insieme ai file .js. se stai copiando i file .js, dovresti copiare il corrispondente .d.ts.

Soluzione n. 1: copia i file d.ts tramite il passaggio di creazione manuale

Una possibile soluzione è copiare tutti i .d.tsfile necessari come types.d.tsmanualmente in una fase di compilazione. Lo strumento concreto è la preferenza e dipende dal tuo progetto e tipo di build, OS tra gli altri. Questo strumento dovrebbe preservare la struttura della directory sotto srcquando si copiano i file build, in modo che i importriferimenti al tipo funzionino ancora. Per dirne alcuni:https://serverfault.com/questions/180853/how-to-copy-file-preserving-directory-path-in-linux(shell) rsync, robocopyo una piattaforma pacchetto npm indipendente comehttps://www.npmjs.com/package/copyfiles:

"scripts": {
  "copy-dts": "copyfiles -u 1 \"src/**/*.d.ts\" build"
}

Soluzione 2: riformula i file d.ts in estensione .ts

Riformula i tuoi .d.tsfile in .tsestensione (o reintegrazione dei tipi in .tsfile esistenti ), quindi tscsi occupa di emettere le dichiarazioni nell'output. Leggero svantaggio: non esiste una separazione forzata dal compilatore tra i tipi e il codice di implementazione (i d.tsfile non possono contenere codice). Il grande vantaggio è che non è necessario un passaggio di costruzione aggiuntivo.

Secondo me, quest'ultimo è l'approccio più semplice per generare un'API pubblica, ad esempio per il tuo pacchetto npm, mentre un .d.tsfile potrebbe essere un candidato per una dichiarazione di tipo condivisa e utilizzata internamente.

Spero che aiuti.