【问题标题】:How to add/remove modifier to/from a statement?如何在语句中添加/删除修饰符?
【发布时间】: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


    【解决方案1】:

    你可以使用 ts.transform

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

      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);
        };
    }
    

    【讨论】:

      猜你喜欢
      • 2012-05-01
      • 1970-01-01
      • 2018-02-06
      • 2019-07-11
      • 1970-01-01
      • 2022-06-28
      • 2011-05-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多