所以也许我很困惑,但我想如果我添加declaration:true
到我的 tsconfig.json 我可以让它 tsc 复制我的*.d.ts
文件,以及转译的代码和它的d.ts
files?
EG:
- src
- lib
- types.d.ts
- foo.ts
我期望 tsc 的结果是这样的:
- build
- lib
- types.d.ts
- foo.js
- foo.d.ts
但是,我似乎无法得到types.d.ts
复制到我的构建目录。
typescript 不提供任何复制机制吗.d.ts
文件?或者我只是在某个地方配置错误? (此时我已经尝试了很多不同的配置;似乎没有任何效果)
你是对的 -declaration:true
意味着仅对于每个给定的.ts
file tsc
生成并复制对应的.d.ts
输出文件到build
目录(除了.js
and .map
如果适用)。所以tsc
不会复制您的定制types.d.ts
文件到输出目录。
基本上.d.ts
文件被视为编译器进行类型检查的不可触及的输入。它们不用于任何输出生成,这也意味着它们不会被复制到build
。您可以阅读更多内容here关于维护者的立场:
您使用的 .d.ts 文件是构建系统的输入,而不是输出。使用 .d.ts 中的某些类型但让您的输出不使用这些类型是完全合理的,因此没有理由将输入 .d.ts 与您的构建结果一起分发。 [...] 听起来您需要在构建工具中执行构建后步骤,将相关的 .d.ts 文件复制到您需要的任何位置。
.d.ts 文件被视为“引用”,编译器不会触及它们、不会移动它们或重新创建它们。考虑 .d.ts 文件的一个简单方法是它们与 .js 文件一起使用。如果您要复制 .js 文件,则应复制匹配的 .d.ts。
解决方案#1:通过手动构建步骤复制 d.ts 文件
一个可能的解决方案是复制所有需要的.d.ts
文件如types.d.ts
在构建步骤中手动进行。具体工具是偏好的,取决于您的项目和构建类型、操作系统等。该工具应保留下的目录结构src
将文件复制到时build
, 以便import
类型引用仍然有效。仅举几例:cp --parents(壳),rsync
, robocopy
或独立于平台的 npm 包,例如复制文件:
"scripts": {
"copy-dts": "copyfiles -u 1 \"src/**/*.d.ts\" build"
}
解决方案 #2:将 d.ts 文件改写为 .ts 扩展名
改写你的.d.ts
文件到.ts
扩展(或将类型重新集成到现有的.ts
文件),所以tsc
负责在输出中发出声明。轻微的缺点:编译器没有强制类型和实现代码之间的分离(d.ts
文件不允许包含代码)。最大的优点是,您不需要额外的构建步骤。
在我看来,后者是生成公共 API 的最简单方法,例如对于你的 npm 包,而.d.ts
file 可以成为内部使用和共享类型声明的候选者。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)