首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >TypeScript编译器API:如何在语句中添加/删除修饰符

TypeScript编译器API:如何在语句中添加/删除修饰符
EN

Stack Overflow用户
提问于 2020-11-30 22:56:28
回答 1查看 319关注 0票数 1

我正在使用TypeScript编译器API来转换TypeScript代码,但是有一件事我还没有弄清楚,那就是以通用的方式添加/删除修饰符。我得到的最接近的是这个

代码语言:javascript
复制
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节点?

EN

回答 1

Stack Overflow用户

发布于 2021-06-19 17:40:57

您可以使用ts.transform

https://github.com/madou/typescript-transformer-handbook#writing-your-first-transformer

代码语言:javascript
复制
  const result = ts.transform<ts.SourceFile>(sourceFiles, [transformer]);

  function transformer<T extends ts.Node>(context: ts.TransformationContext) {
    return (rootNode: T) => {
        function visit(sourceFile: ts.Node): ts.Node {

            return ts.visitEachChild(sourceFile, (node) => converNode(node), context);
        }

        function converNode(node: ts.Node) {

            return ts.visitEachChild(node, visitChilds, context);

            function visitChilds(child: ts.Node): ts.Node | undefined {
                if (child.kind == ts.SyntaxKind.ExportKeyword) return undefined;
                if (child.kind == ts.SyntaxKind.AsyncKeyword) return undefined;

                return ts.visitEachChild(child, visitChilds, context);
            }

         
        }

        return ts.visitNode(rootNode, visit);
    };
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65075866

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档