TypeScript 中的 emitDeclarationOnly
说明 emitDeclarationOnly 为什么只生成 .d.ts 而不生成 .js,以及它为什么常见于使用 Babel、SWC、esbuild 或 bundler 负责转译的项目。
#tech / dev
#resource / typescript
#type / concept
#status / growing
[!info] related notes
- 所属 MOC: TypeScript MOC
- 配置入口: tsconfig 使用详解
- 并列概念: TypeScript 中的 declaration 与 declarationMap, TypeScript 中的 noEmit
TypeScript 中的 emitDeclarationOnly
一句话定义
emitDeclarationOnly 表示 TypeScript 只生成 .d.ts,不生成 .js。
核心机制 / 工作原理
官方文档直接给出的定义是:
- only emit
.d.tsfiles - do not emit
.jsfiles
它最适合两类场景:
- JavaScript 由 TypeScript 之外的 transpiler 生成
- TypeScript 只负责给消费者产出类型声明
最小例子 / 最小场景
{
"compilerOptions": {
"declaration": true,
"emitDeclarationOnly": true
}
}
这常见于:
- Babel / SWC / esbuild 负责 JS 转译
- 库项目单独跑一遍
tsc生成类型产物
边界与易混淆点
它不等于 noEmit
noEmit 是:
- 什么都不生成
而 emitDeclarationOnly 是:
- 只生成声明,不生成 JS
它通常和 declaration 一起出现
因为没有声明输出目标时,这个选项本身就失去意义。
它适合“转译和类型产物分工明确”的项目
如果 JS 输出本来就完全依赖 bundler 或其他 transpiler,这个选项会比直接让 tsc 产出完整 JS 更清晰。
参考信息
- TSConfig
emitDeclarationOnly: https://www.typescriptlang.org/tsconfig/emitDeclarationOnly.html