如何通过Node.js API对指定TypeScript文件执行类型检查?
通过TypeScript Node.js API实现单文件类型检查
TypeScript官方API里并没有你期望的checkTypes方法,但可以用现有API实现单文件类型检查的需求,以下是具体实现:
步骤1:创建Program实例
首先通过createProgram创建Program对象,指定目标文件和编译配置:
import TypeScript from "typescript"; // 编译配置,可根据项目实际tsconfig调整 const compilerOptions: TypeScript.CompilerOptions = { target: TypeScript.ScriptTarget.ESNext, module: TypeScript.ModuleKind.CommonJS, strict: true, }; // 创建Program,传入要检查的文件列表和编译选项 const program = TypeScript.createProgram(["foo.ts"], compilerOptions);
步骤2:获取目标文件的诊断信息
Program提供了两类诊断方法,分别针对语法错误和类型错误,我们可以过滤出目标文件的结果:
const targetFile = program.getSourceFile("foo.ts"); if (!targetFile) { throw new Error("目标文件不存在"); } // 获取语法诊断(比如括号不闭合、关键字拼写错误等) const syntacticDiagnostics = program.getSyntacticDiagnostics(targetFile); // 获取语义诊断(比如类型不匹配、未定义变量等) const semanticDiagnostics = program.getSemanticDiagnostics(targetFile); // 合并两类诊断结果 const allDiagnostics = [...syntacticDiagnostics, ...semanticDiagnostics];
步骤3:格式化诊断结果
把TypeScript返回的Diagnostic对象转换成你期望的结构:
const typesCheckingResults = { issues: allDiagnostics.map(diagnostic => { const { line, character } = TypeScript.getLineAndCharacterOfPosition(targetFile, diagnostic.start!); return { lineNumber: line + 1, // 转换为日常使用的从1开始的行号 columnNumber: character + 1, // 转换为从1开始的列号 code: `TS${diagnostic.code}`, message: TypeScript.flattenDiagnosticMessageText(diagnostic.messageText, "\n") }; }) }; // 遍历输出结果 for (const issue of typesCheckingResults.issues) { console.log(issue.lineNumber); console.log(issue.columnNumber); console.log(issue.code); console.log(issue.message); }
注意事项
- 确保目标文件路径和
createProgram中传入的路径完全一致,否则getSourceFile会返回undefined - 如果需要复用Program实例检查多个文件,重复步骤2和3即可,无需重新创建Program
- 还可以添加
getOptionsDiagnostics获取编译配置相关的诊断(比如配置项错误)
内容的提问来源于stack exchange,提问作者Takeshi Tokugawa YD
相关产品推荐
相关产品推荐

