You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.07 23:26:05