如何通过TypeScript Compiler API获取导入常量的类型与值?
现有代码:
// file1 export const VIEWPORT_HEIGHT = 1080; // file2 import { VIEWPORT_HEIGHT } from '../../constants/app';
处理file2的AST时,需获取VIEWPORT_HEIGHT的字面量类型1080(而非宽泛的number)及具体值,目标是实现VSCode悬停导入时显示常量值的效果。
已定位AST节点路径:ImportDeclaration > ImportClause > NamedImports > ImportSpecifier > Identifier,且能通过webpack ts-loader传入的program获取类型检查器checker,但无法获取目标类型与值,请问缺失哪些关键步骤?
要获取导入常量的字面量类型和值,需通过类型检查器追踪到原始导出符号的定义,具体步骤如下:
关联导入符号与原始导出
从ImportSpecifier的local标识符节点(即file2中本地的VIEWPORT_HEIGHT)调用checker.getSymbolAtLocation(localIdentifier)获取符号对象symbol。由于导入符号是原始导出符号的别名,跨模块导入时必须通过checker.getAliasedSymbol(symbol)拿到真实的原始导出符号。定位原始声明节点
通过原始符号的declarations属性(或getDeclarations()方法)获取file1中VIEWPORT_HEIGHT的VariableDeclaration声明节点,进而拿到其初始化器initializer(即1080对应的NumericLiteral节点)。提取类型与值
- 调用
checker.getTypeAtLocation(initializer),即可得到字面量类型1080(而非number); - 直接从
initializer.value或initializer.text获取常量的具体值1080。
- 调用
类型收窄校验(可选)
若原始常量通过as const实现类型收窄,可通过checker.getLiteralTypeSymbol(type)确认字面量类型的细节,确保类型检查器正确识别了收窄后的类型。
内容的提问来源于stack exchange,提问作者Ashitaka

