Javascript Babel类型转换-在操作符周围添加空格。如何绕道?

Javascript Babel类型转换-在操作符周围添加空格。如何绕道?,javascript,typescript,babeljs,transformation,codemod,Javascript,Typescript,Babeljs,Transformation,Codemod,我有一行代码,我正试图与巴贝尔转换 这,const[firstName,setFirstName]=useState(“”) 但是,当我运行转换以插入此代码时,周围都有额外的空间。所以我得到了useState(“”) 我觉得这可能是有意的代码格式化。但对于这一特定领域,我希望它不要这样做。我不希望运算符周围的额外空间仅用于我代码的这一部分。。我怎样才能做到这一点 这是我的转换/配置 types.variableDeclaration(“const”[ 类型.variableDeclarator(

我有一行代码,我正试图与巴贝尔转换

这,
const[firstName,setFirstName]=useState(“”)

但是,当我运行转换以插入此代码时,
周围都有额外的空间。所以我得到了
useState(“”)

我觉得这可能是有意的代码格式化。但对于这一特定领域,我希望它不要这样做。我不希望运算符周围的额外空间仅用于我代码的这一部分。。我怎样才能做到这一点

这是我的转换/配置

types.variableDeclaration(“const”[
类型.variableDeclarator(
类型.arrayPattern([
类型。标识符(“名字”),
类型标识符(“setFirstName”)
]),
types.binaryExpression(
">",
types.binaryExpression(

“如果你想做一个类型注释,你需要做一个类型注释AST节点,而不是
二进制表达式
括号表达式
等等。AST节点有特定的含义,你所构造的是语法描述,而不是语义描述,因此很奇怪

如果您不知道所需的AST节点类型,通常最好对要生成的代码运行Babel解析器,因为您可以看到所需的节点类型

在您的情况下,您需要以下内容:

const callNode = types.callExpression(
  types.identifier("useState"),
  [types.stringLiteral("")]
);
callNode.typeParameters = types.tsTypeParameterInstantiation([
  types.tsStringKeyword()
]);

const declNode = types.variableDeclaration("const", [
  types.variableDeclarator(
    types.arrayPattern([
        types.identifier("firstName"),
        types.identifier("setFirstName")
    ]),
    callNode,
  )
]);
所有这些都是用手工构造的,这可能是非常困难的,所以根据你的需要,我会考虑用<代码>模板<代码>来做,例如

const declNode = template.statement({ plugins: ["typescript"] }).ast`
  const [firstName, setFirstName] = useState<string>();
`;
const declNode=template.statement({plugins:[“typescript”]}).ast`
const[firstName,setFirstName]=useState();
`;

谢谢。调用表达式正是我需要使用的。我希望有更好的方法来设置类型参数。奇怪的是,调用表达式在我从babel实际解析时出现,但在AST Explorer中,它是一个二进制表达式。您可能没有告诉AST Explorer将文件解析为TS。您粘贴的代码也包含有效的JavaScript,但是它有不同的行为。这是TS严格来说不是JS超集的少数情况之一,但事实上改变了它的解析行为。我所能做的就是选择babel parser,或者typescript parser,否?@SeanMC在
babel parser
旁边的齿轮图标让你选择要启用的解析器插件。
typescript
就是其中之一,请确保同时禁用
flow
。谢谢,我刚刚发现了这一点,正要更新我的评论,但你抢先一步。再次感谢!