Ошибка выброса jscodeshift: не соответствует строке типа
Я пытаюсь преобразовать это:
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
0 ответов
Ваш код заменяет 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