TypeScript 中的 verbatimModuleSyntax
说明 verbatimModuleSyntax 如何把 TypeScript 的模块 emit 规则改成所写即所得,以及它为什么会让 import type 与模块配置边界更清晰。
#tech / dev
#resource / typescript
#type / concept
#status / growing
[!info] related notes
TypeScript 中的 verbatimModuleSyntax
一句话定义
verbatimModuleSyntax 让 TypeScript 更接近“你写什么模块语法,就按什么语法保留”。
核心机制 / 工作原理
在这个选项开启后,规则会明显变简单:
- 带
type的 import / export 会在 emit 时被擦除 - 不带
type的 import / export 会被原样保留
也就是:
type修饰符决定哪些只是类型依赖,其他模块语法按字面保留。
这也是官方强调的“所写即所得”思路。
最小例子 / 最小场景
{
"compilerOptions": {
"verbatimModuleSyntax": true
}
}
配合:
import { createApp } from "vue";
import type { User } from "./user";
通常会表现成:
createApp相关导入保留User的类型导入被擦除
边界与易混淆点
它会让 import type 变得更重要
如果你没有明确写 type,TypeScript 更倾向于把这条导入视为真正的模块语法保留下来。
所以这个选项常和:
import type
一起理解。
它会更早暴露模块配置不一致
官方文档特别指出,在这个选项下,TypeScript 不再把 ESM 语法静默改写成 require 风格。
这意味着如果你当前文件和模块配置本质上是 CommonJS 语境,却写了 ESM 风格语法,问题会更早暴露出来。
它也是旧导入 emit 选项的收敛终点
当前官方文档已经把下面两个旧选项都标成:
- Deprecated in favor of
verbatimModuleSyntax
也就是:
它主要简化的是 emit 语义,不是模块解析算法
它不负责决定:
- 模块怎么找
- package exports 怎么选
这些仍然更接近:
modulemoduleResolution
参考信息
- TSConfig
verbatimModuleSyntax: https://www.typescriptlang.org/tsconfig/verbatimModuleSyntax.html