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

使用TypeScript Compiler API解析TS接口时Symbol始终为undefined

解决TypeScript Compiler API获取接口Symbol返回undefined的问题

你的代码存在几个关键问题导致无法正确获取Symbol,以下是具体修正方案:

问题分析

  • 变量名不匹配:定义了source变量,但创建sourceFile时误用了未定义的sourceCode,导致解析空内容。
  • 缺少TypeChecker实例:直接使用checker但从未从program中获取,这是读取Symbol的核心依赖对象。
  • SourceFile上下文不关联:手动创建的ts.createSourceFile文件未关联到program的编译上下文,checker无法识别其中的符号。

修正后的代码

import * as ts from 'typescript';

const fileName = 'test.ts';

const source = `
export interface Company {
  name: string;
  address: Address;
}

export interface Employee {
  name: string;
  age: number;
  company: Company;
}
`;

// 创建program时自定义文件读取逻辑,加载我们的source内容
const program = ts.createProgram([fileName], {}, {
  getSourceFile: (name, languageVersion) => {
    if (name === fileName) {
      return ts.createSourceFile(name, source, languageVersion, true);
    }
    return ts.createSourceFile(name, '', languageVersion, true);
  },
  writeFile: () => {},
  getDefaultLibFileName: () => 'lib.d.ts',
  useCaseSensitiveFileNames: () => false,
  getCurrentDirectory: () => '',
  getCanonicalFileName: (fileName) => fileName,
  getNewLine: () => '\n',
});

// 获取TypeChecker实例
const checker = program.getTypeChecker();

// 从program中获取关联后的sourceFile
const sourceFile = program.getSourceFile(fileName)!;

for (const statement of sourceFile.statements) {
  if (ts.isInterfaceDeclaration(statement)) {
    const symbol = checker.getSymbolAtLocation(statement.name);
    console.log('symbol:', symbol);
    if (symbol) {
      const type = checker.getDeclaredTypeOfSymbol(symbol);
      console.log('interface type:', type);
    }
  }
}

关键修改说明

  1. 自定义CompilerHost:通过ts.createProgram的第三个参数自定义文件读取逻辑,让program加载我们定义的source内容,而非读取本地文件。
  2. 获取TypeChecker:通过program.getTypeChecker()获取核心类型检查器,它负责解析和提供符号信息。
  3. 使用program关联的SourceFile:从program中获取处于正确编译上下文的sourceFile,确保checker能识别其中的接口符号。

运行修正后的代码,即可正常获取到接口的Symbol及对应类型信息。

内容的提问来源于stack exchange,提问作者Gaofang

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.21 18:13:07