Ошибка выброса jscodeshift: не соответствует строке типа - PullRequest
2 голосов
/ 06 марта 2019

Я пытаюсь преобразовать это:

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:

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 Ответ

1 голос
/ 29 июня 2019

То, что делает ваш код, заменяет 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

...