使用TypeScript Program API时,输出文件无/多源文件的场景咨询
TypeScript Program.emit中WriteFileCallback的sourceFiles为空或多文件场景
我正在开发一款Rollup插件,使用TypeScript的Program API编译源文件。从Program::emit和WriteFileCallback的类型定义可以推断,输出文件可以对应0到n个源文件:
emit(targetSourceFile?: SourceFile, writeFile?: WriteFileCallback, cancellationToken?: CancellationToken, emitOnlyDtsFiles?: boolean, customTransformers?: CustomTransformers): EmitResult; type WriteFileCallback = (fileName: string, text: string, writeByteOrderMark: boolean, onError?: (message: string) => void, sourceFiles?: readonly SourceFile[], data?: WriteFileCallbackData) => void;
从类型定义能看到,WriteFileCallback里的sourceFiles是可选的只读数组,可能出现两种情况:
- 不存在(无对应源文件)
- 包含多个源文件
我需要编写测试用例覆盖这两种情况,想了解这两种场景分别会在什么情况下发生?
一、sourceFiles不存在(无对应源文件)的场景
- 全局类型声明文件生成:当开启
declaration: true配置,且TypeScript自动将多个源文件的类型声明合并为单个全局.d.ts文件时,这个输出文件没有明确关联的用户源文件,此时sourceFiles会是undefined。 - TS内部辅助文件生成:开启
importHelpers: true时,TypeScript会生成tslib.js这类辅助工具文件,这类文件是TS内置的通用代码,和用户的源文件无直接关联,sourceFiles会为空。 - 自定义无关联输出:如果通过自定义转换器生成完全不依赖任何用户源文件的输出(比如自动生成项目配置文件、统计日志文件),此时
sourceFiles也会是undefined。
二、sourceFiles包含多个源文件的场景
- 多文件合并输出:配置
outFile将多个源文件打包成单个输出文件时(比如把moduleA.ts、moduleB.ts合并为bundle.js),这个输出文件对应所有参与合并的源文件,sourceFiles会包含这些源文件的实例。 - 类型声明合并:多个源文件中定义的同名接口、类型被TypeScript自动合并到同一个
.d.ts文件时,该声明文件的sourceFiles会包含所有贡献了该类型的源文件。 - 多源聚合输出:通过自定义转换器从多个源文件提取内容生成汇总文件时(比如提取所有页面组件的路由配置生成
routes.js),这个汇总文件的sourceFiles会包含所有被提取内容的源文件。
内容的提问来源于stack exchange,提问作者user354490
相关产品推荐
相关产品推荐

