能否使用TypeScript Compiler API识别变量声明的var/let/const种类?
TypeScript Compiler API 变量声明类型判断解决方案
问题根因
你遇到的flags比对失败主要有两个常见原因:一是解析配置不符合要求,导致节点flags标记未正确生成;二是flags为位枚举类型,不能直接用全等判断。
解决步骤
1. 修正解析配置
直接调用 ts.createSourceFile 解析时
需保证以下参数设置正确:
- 第三个参数
languageVersion指定为ES2015及以上版本(const/let为ES2015新增语法,低版本目标下不会生成对应标记) - 第四个参数
setParentNodes设为true,保证节点属性完整
示例代码:
const sourceFile = ts.createSourceFile( "test.js", `const a = 1;`, ts.ScriptTarget.ES2015, true );
通过 ts.createProgram 批量解析时
需在CompilerOptions中增加以下配置:
allowJs: true开启JavaScript文件解析支持target: ts.ScriptTarget.ES2015及以上版本
2. 正确判断变量声明类型
flags为位枚举值,是多个标记的位运算组合,需用按位与操作验证对应标记是否存在,不能直接全等比对:
const varDecList = sourceFile.statements[0] as ts.VariableDeclarationList; // 判断const const isConst = !!(varDecList.flags & ts.NodeFlags.Const); // 判断let const isLet = !!(varDecList.flags & ts.NodeFlags.Let); // 判断var,var无对应const/let标记 const isVar = !isConst && !isLet;
3. const断言额外判断
如果需要识别带const断言的声明,可额外判断变量声明的初始值属性:
const varDec = varDecList.declarations[0]; const hasConstAssertion = varDec.initializer && ts.isAsExpression(varDec.initializer) && varDec.initializer.type?.kind === ts.SyntaxKind.TypeReference && (varDec.initializer.type.typeName as ts.Identifier).text === "const";
内容的提问来源于stack exchange,提问作者fehaa
相关产品推荐
相关产品推荐

