jscodeshift抛出错误:与类型字符串不匹配

时间:2019-03-06 13:20:51

标签: javascript jscodeshift codemod

我正在尝试改变它:

function twist() {
  this.settings = null;
  delete this.settings;
  this.whatever = null;
  this.something['hello'] = null;
  this.hello = "test";
}

对此:

function twist() {
  delete this.settings;
  delete this.settings;
  delete this.whatever;
  delete this.something['hello'];
  this.hello = "test";
}

所以我为jscodeshift编写了以下codemod:

export default function transformer(file, api) {
  const j = api.jscodeshift;

  return j(file.source)
    .find(j.ExpressionStatement, {expression: j.BinaryExpression})
    .filter(p => p.value.expression.operator === "=")
    .filter(p => p.value.expression.right.type === "Literal" && p.value.expression.right.raw === "null")
    .filter(p => p.value.expression.left.type === "MemberExpression")
    .replaceWith(path => j.unaryExpression("delete", path.value.expression.left))
    //.filter(p => { console.log(p.value); return true;})
    .toSource();
}

但是我得到了错误:

{operator: delete, argument: [object Object], prefix: true, loc: null, type: UnaryExpression, comments: null} does not match type string

1 个答案:

答案 0 :(得分:1)

您的代码正在执行的操作是将ExpressionStatement替换为UnaryExpression。用Statements替换Expressions可能很麻烦。

它也寻找BinaryExpression,但BinaryExpression没有=作为运算符。

实际上,您的过滤器应该是AssignmentExpression,因为您实际要做的是将AssignmentExpression内的ExpressionStatement替换为UnaryExpression,从而替换一个Expression与另一个。

export default function transformer(file, api) {
  const j = api.jscodeshift;

  return j(file.source)
    .find(j.AssignmentExpression, {
      operator: "=",
      right: {
        type: "Literal",
        value: null
      }
    })
    .replaceWith(({ node: { left } }) => j.unaryExpression("delete", left))
    .toSource();
}

以下是ASTExplorer的示例:https://astexplorer.net/#/gist/afb441a9709f82cd6fc3ba2860c98823/6f21cdb12a5a43aa1ca460aaa40d9ef63e1ef4bc