【问题标题】:jscodeshift throwing error: does not match type stringjscodeshift抛出错误:不匹配类型字符串
【发布时间】:2019-03-06 13:20:51
【问题描述】:

我正在尝试改变这个:

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

【问题讨论】:

    标签: javascript jscodeshift codemod


    【解决方案1】:

    您的代码所做的是将ExpressionStatement 替换为UnaryExpression。将 Statements 替换为 Expressions 可能很挑剔。

    它还会查找 BinaryExpression,但 BinaryExpression 没有 = 作为运算符。

    您的过滤器实际上应该是AssignmentExpression,因为您真正想要做的是将ExpressionStatement 内部的AssignmentExpression 替换为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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-10-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-07-26
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多