Typescriptはビルドするd.tsファイルをコピーしません

May 07 2019

混乱しているかもしれませんがdeclaration:true、tsconfig.jsonに追加すると、トランスパイルされた*.d.tsコードとそのファイルと一緒に、ファイルをtscでコピーできると思いましたd.ts

例えば:

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

tscの結果は次のようになると思います。

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

ただし、types.d.tsビルドディレクトリにコピーされていないようです。

typescriptは.d.tsファイルをコピーするメカニズムを提供しませんか?それとも、どこかに設定ミスがありますか?(この時点でさまざまな構成を試しましたが、何も機能しないようです)

回答

25 ford04 Jun 04 2019 at 08:43

あなたが正しいこと-declaration:trueだけ与えられたそれぞれのためにことを意味し.ts、ファイルtscに対応する生成され、コピー.d.tsに出力ファイルをbuild(に加えて、ディレクトリ.jsおよび.map該当する場合)。したがってtsc、カスタムtypes.d.tsファイルを出力ディレクトリにコピーしません。

基本的に、.d.tsファイルはコンパイラが型チェックを行うための触れられない入力と見なされます。これらは出力生成には使用されませんbuild。つまり、にコピーされません。あなたはもっと読むことができますhttps://github.com/Microsoft/TypeScript/issues/5112 メンテナの立場について:

使用する.d.tsファイルはビルドシステムへの入力ですが、出力ではありません。.d.tsからいくつかのタイプを使用することは完全に合理的ですが、出力でそれらのタイプを使用しないようにするため、ビルド結果とともに入力.d.tsを配布する理由はありません。[...]ビルドツールのビルド後の手順で、関連する.d.tsファイルを必要な場所にコピーする必要があるようです。

.d.tsファイルは「参照」と見なされ、コンパイラーはそれらに触れたり、移動したり、再作成したりしません。.d.tsファイルを考える簡単な方法は、それらが.jsファイルと一緒に使用されることです。.jsファイルをコピーする場合は、一致する.d.tsをコピーする必要があります。

解決策1:手動ビルドステップでd.tsファイルをコピーする

考えられる解決策は、ビルドステップで手動の.d.tsように必要なすべてのファイルをコピーtypes.d.tsすることです。具体的なツールは好みであり、プロジェクトやビルドタイプ、OSなどに依存します。このツールは、srcファイルをにコピーするときに下のディレクトリ構造を保持して、型参照が引き続き機能するbuildようにする必要がありますimport。いくつか例を挙げると:https://serverfault.com/questions/180853/how-to-copy-file-preserving-directory-path-in-linux(シェル)、 rsyncrobocopyなどのプラットフォームに依存しないNPMパッケージhttps://www.npmjs.com/package/copyfiles

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

解決策#2:d.tsファイルを.ts拡張子に書き直します

.d.tsファイルを.ts拡張子に言い換える(またはタイプを既存の.tsファイルに再統合する)のでtsc、出力で宣言を出力するように注意してください。わずかな欠点:型と実装コードをコンパイラーで強制的に分離d.tsすることはできません(ファイルにコードを含めることはできません)。大きな利点は、追加のビルドステップが必要ないことです。

私の意見では、後者は、たとえばnpmパッケージ用のパブリックAPIを生成する最も簡単なアプローチ.d.tsですが、ファイルは内部で使用される共有型宣言の候補になる可能性があります。

願っています、それは助けになります。