使用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); } } }
关键修改说明
- 自定义CompilerHost:通过
ts.createProgram的第三个参数自定义文件读取逻辑,让program加载我们定义的source内容,而非读取本地文件。 - 获取TypeChecker:通过
program.getTypeChecker()获取核心类型检查器,它负责解析和提供符号信息。 - 使用program关联的SourceFile:从program中获取处于正确编译上下文的sourceFile,确保checker能识别其中的接口符号。
运行修正后的代码,即可正常获取到接口的Symbol及对应类型信息。
内容的提问来源于stack exchange,提问作者Gaofang
相关产品推荐
相关产品推荐

