如何将外部文件加载为TypeScript SourceFile并纳入Program?
可行解决方案
自定义Program实例时纳入外部文件
创建Program时,将目标外部文件添加到rootNames参数数组中:const program = ts.createProgram({ rootNames: ['./src/main.ts', './external/file.ts'], options: { /* 你的编译选项 */ } });这样Program会自动管理这些文件,调用
program.getSourceFile('./external/file.ts')就能拿到对应的SourceFile对象。如果外部文件无需编译,可配合skipLibCheck或调整include/exclude配置避免编译报错。调用Program的addSourceFile方法(注意版本兼容)
部分TypeScript版本的Program实例提供addSourceFile方法,可手动将创建好的SourceFile加入Program:const externalSourceFile = ts.createSourceFile( './external/file.ts', fs.readFileSync('./external/file.ts', 'utf8'), ts.ScriptTarget.Latest, true ); program.addSourceFile(externalSourceFile);操作完成后,
program.getSourceFile('./external/file.ts')即可获取该文件。在Transformer插件中手动关联文件
若在TS插件场景下,除getExternalFiles外,可在transform钩子中检查文件是否存在,不存在则创建并关联:function transformer(program: ts.Program) { const externalFileName = './external/file.ts'; let sourceFile = program.getSourceFile(externalFileName); if (!sourceFile) { const content = fs.readFileSync(externalFileName, 'utf8'); sourceFile = ts.createSourceFile( externalFileName, content, ts.ScriptTarget.Latest, true ); // 借助LanguageService关联,或修改Program内部缓存(内部API有兼容性风险) (program as any).getSourceFileCache.set(externalFileName, sourceFile); } return (context: ts.TransformationContext) => { // 你的转换逻辑 return (sourceFile: ts.SourceFile) => sourceFile; }; }注意:修改内部API需谨慎,优先使用官方公开方法。
调整tsconfig.json的include配置
若外部文件可纳入项目编译范围,直接在tsconfig.json的include数组添加文件路径:{ "include": [ "src/**/*", "./external/file.ts" ] }重新创建Program后,TS会自动加载该文件,
program.getSourceFile可正常获取。
内容的提问来源于stack exchange,提问作者Alfreds Genkins
相关产品推荐
相关产品推荐

