TypeScript变形金刚-装饰器并未完全从AST中移除

时间:2019-08-28 18:04:56

标签: typescript typescript-compiler-api

我正在尝试从某些源文件的AST中删除特定的 Decorator
我能够查找装饰器Node,但是发出的代码仍然包含对__decorate([...])函数的调用。

以下是变形金刚及其Visitor

export default function() {
  function createVisitor(
    ctx: ts.TransformationContext,
    sourceFile: ts.SourceFile
  ): (node: ts.Node) => ts.VisitResult<ts.Node> {
    const visitor: ts.Visitor = (node: ts.Node): ts.VisitResult<any> => {
      if (ts.isDecorator(node)) {
        if (node.getText(sourceFile) === '@Stateful') {
          return undefined;
        }
      }

      return ts.visitEachChild(node, visitor, ctx);
    };

    return visitor;
  }

  return (ctx: ts.TransformationContext) => (sourceFile: ts.SourceFile) =>
    sourceFile.fileName.endsWith('component.ts')
      ? ts.visitNode(sourceFile, createVisitor(ctx, sourceFile))
      : sourceFile;
}

如您所见,我拦截了@Stateful个装饰器Node s

if (ts.isDecorator(node)) {
  if (node.getText(sourceFile) === '@Stateful') {
    return undefined;
  }
}

然后我通过返回Node来删除AST undefined
但是,尽管有一个空数组

,但是编译后的代码仍然使用__decorate函数
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
    ...
};
import { Stateful } from './test.decorator';
export class Example {
    constructor() {
        this.str = '';
    }
    getStr() {
        return this.str;
    }
}
Example = __decorate([], Example);

我想念什么?

0 个答案:

没有答案