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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 07:27:46