Typescript não copia arquivos d.ts para construir

May 07 2019

Talvez eu esteja confuso, mas pensei que se adicionasse declaration:trueao meu tsconfig.json poderia fazer com que ele copiasse meus *.d.tsarquivos, junto com o código transpilado e seus d.tsarquivos.

POR EXEMPLO:

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

Eu esperaria que o resultado do tsc fosse algo como:

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

No entanto, não consigo types.d.tsser copiado para o meu diretório de construção.

O typescript não fornece nenhum mecanismo para copiar .d.tsarquivos? Ou apenas tenho uma configuração incorreta em algum lugar? (Eu tentei várias configurações diferentes neste ponto; nada parece funcionar)

Respostas

25 ford04 Jun 04 2019 at 08:43

Você está certo - declaration:trueimplica que apenas para cada .tsarquivo determinado tscgera e copia um .d.tsarquivo de saída correspondente para o builddiretório (além .jse .mapse aplicável). Portanto tsc, não copie seu types.d.tsarquivo personalizado para o diretório de saída.

Basicamente, os .d.tsarquivos são vistos como uma entrada intocável para o compilador fazer verificações de tipo. Eles não são usados ​​para nenhuma geração de saída, o que também significa que eles não são copiados para build. Você pode ler maishttps://github.com/Microsoft/TypeScript/issues/5112 sobre o ponto de vista dos mantenedores:

Os arquivos .d.ts que você usa são uma entrada para o sistema de compilação, mas não uma saída. É perfeitamente razoável consumir alguns tipos de a .d.ts, mas sua saída não usa esses tipos, portanto, não há razão para distribuir os .d.ts de entrada com os resultados da compilação. [...] Parece que você deseja uma etapa de pós-compilação em sua ferramenta de compilação para copiar os arquivos .d.ts relevantes sempre que precisar deles.

Os arquivos .d.ts são considerados "referências", o compilador não os afetará, não os moverá ou os recriará. Uma maneira fácil de pensar nos arquivos .d.ts é que eles vão junto com seus arquivos .js. se você estiver copiando os arquivos .js, deverá copiar os .d.ts correspondentes.

Solução nº 1: copie os arquivos d.ts por meio da etapa de construção manual

Uma possível solução é copiar todos os .d.tsarquivos necessários, como types.d.tsmanualmente em uma etapa de compilação. A ferramenta concreta é a preferência e depende do seu projeto e tipo de construção, sistema operacional entre outros. Esta ferramenta deve preservar a estrutura do diretório srcao copiar os arquivos para build, para que as importreferências de tipo ainda funcionem. Para nomear alguns:https://serverfault.com/questions/180853/how-to-copy-file-preserving-directory-path-in-linux(shell), rsync, robocopyou um pacote npm independente de plataforma comohttps://www.npmjs.com/package/copyfiles:

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

Solução 2: reordene os arquivos d.ts para a extensão .ts

Reordene seus .d.tsarquivos para a .tsextensão (ou reintegre os tipos em .tsarquivos existentes ), portanto, tsctome o cuidado de emitir as declarações na saída. Ligeira desvantagem: você não tem separação forçada do compilador entre os tipos e o código de implementação (os d.tsarquivos não podem conter código). A grande vantagem é que você não precisa de uma etapa de construção adicional.

Em minha opinião, a última é a abordagem mais fácil para gerar uma API pública, por exemplo, para seu pacote npm, enquanto um .d.tsarquivo pode ser candidato a uma declaração de tipo compartilhada e usada internamente.

Espero que ajude.