【发布时间】:2020-11-30 14:56:27
【问题描述】:
我正在使用 TypeScript 编译器 API 来转换 TypeScript 代码,但我还没有完全弄清楚的一件事是以通用方式添加/删除修饰符。我得到的最接近的是这个
function removeDeclareModifier(s) {
let modifiers;
// Remove declare modifiers
if (s.modifiers) {
modifiers = s.modifiers.filter(m => m.kind !== ts.SyntaxKind.DeclareKeyword);
} else {
return s;
}
if (ts.isVariableStatement(s)) {
return ts.updateVariableStatement(s, modifiers, s.declarationList);
} else if (ts.isTypeAliasDeclaration(s)) {
return ts.updateTypeAliasDeclaration(s, s.decorators, modifiers, s.name, s.typeParameters, s.type);
} else if (ts.isInterfaceDeclaration(s)) {
return ts.updateInterfaceDeclaration(s, s.decorators, modifiers, s.name, s.typeParameters, s.heritageClauses, s.members);
} else if (ts.isEnumDeclaration(s)) {
return ts.updateEnumDeclaration(s, s.decorators, modifiers, s.name, s.members);
} else if (ts.isClassDeclaration(s)) {
return ts.updateClassDeclaration(s, s.decorators, modifiers, s.name, s.typeParameters, s.heritageClauses, s.members);
} else if (ts.isFunctionDeclaration(s)) {
return ts.updateFunctionDeclaration(s, s.decorators, modifiers, s.asteriskToken, s.name, s.typeParameters, s.parameters, s.type, s.body);
}
return s;
}
但这看起来真的很冗长,可能会遗漏大量案例,并且当其中一个签名更改时很容易崩溃。
我找到了另一个答案,建议替换修饰符数组,但 s.modifiers 是只读的,所以 TypeScript 不会让我这样做。
有没有更好的方法来更新修饰符而不重新创建整个 AST 节点?
【问题讨论】:
标签: typescript modifier typescript-compiler-api