Typescript ne copie pas les fichiers d.ts à construire

May 07 2019

Alors peut-être que je suis confus, mais je pensais que si declaration:truej'ajoutais à mon tsconfig.json, je pourrais le faire copier par tsc mes *.d.tsfichiers, avec le code transpilé et ses d.tsfichiers?

PAR EXEMPLE:

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

Je m'attendrais à ce que le résultat de tsc soit quelque chose comme:

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

Cependant, je n'arrive pas types.d.tsà être copié dans mon répertoire de construction.

Le typographie ne fournit-il aucun mécanisme pour copier des .d.tsfichiers? Ou est-ce que j'ai juste une mauvaise configuration quelque part? (J'ai essayé beaucoup de configurations différentes à ce stade; rien ne semble fonctionner)

Réponses

25 ford04 Jun 04 2019 at 08:43

Vous avez raison - declaration:trueimplique que seulement pour chaque .tsfichier donné tscgénère et copie un .d.tsfichier de sortie correspondant dans le buildrépertoire (en plus .jset le .mapcas échéant). Donc tsc, ne copiera pas votre types.d.tsfichier personnalisé dans le répertoire de sortie.

Fondamentalement, les .d.tsfichiers sont considérés comme une entrée intouchable permettant au compilateur d'effectuer des vérifications de type. Ils ne sont utilisés pour aucune génération de sortie, ce qui signifie également qu'ils ne sont pas copiés build. Vous pouvez en savoir plushttps://github.com/Microsoft/TypeScript/issues/5112 à propos du point de vue des responsables:

Les fichiers .d.ts que vous utilisez sont une entrée dans le système de construction mais pas une sortie. Il est parfaitement raisonnable de consommer certains types d'un .d.ts mais que votre sortie n'utilise pas ces types. [...] Il semble que vous souhaitiez une étape de post-construction dans votre outil de construction pour copier les fichiers .d.ts pertinents là où vous en avez besoin.

Les fichiers .d.ts sont considérés comme des «références», le compilateur ne les touchera pas, ne les déplacera pas et ne les recréera pas. Un moyen simple de penser aux fichiers .d.ts est qu'ils vont avec vos fichiers .js. si vous copiez les fichiers .js, vous devez copier le .d.ts correspondant.

Solution n ° 1: Copiez les fichiers d.ts via l'étape de construction manuelle

Une solution possible consiste à copier tous les .d.tsfichiers nécessaires comme types.d.tsmanuellement dans une étape de construction. L'outil concret est la préférence et dépend de votre projet et du type de construction, OS entre autres. Cet outil doit conserver la structure de répertoires sous srclors de la copie de fichiers build, afin que importles références de type fonctionnent toujours. Pour n'en nommer que quelques-uns:https://serverfault.com/questions/180853/how-to-copy-file-preserving-directory-path-in-linux(shell), rsync, robocopyou un paquet de plate - forme indépendante comme npmhttps://www.npmjs.com/package/copyfiles:

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

Solution n ° 2: reformulez les fichiers d.ts en extension .ts

Reformulez vos .d.tsfichiers en .tsextension (ou réintégrez les types dans des .tsfichiers existants ), tscs'occupe donc d'émettre les déclarations dans la sortie. Léger inconvénient: vous n'avez pas de séparation imposée par le compilateur entre les types et le code d'implémentation (les d.tsfichiers ne sont pas autorisés à contenir du code). Le gros avantage est que vous n'avez pas besoin d'une étape de construction supplémentaire.

À mon avis, cette dernière est l'approche la plus simple pour générer une API publique, par exemple pour votre package npm, alors qu'un .d.tsfichier pourrait faire un candidat pour une déclaration de type utilisée et partagée en interne.

J'espère que ça t'as aidé.