如何解决Babel 类型转换 - 在运算符周围添加空间如何绕过?
我想用 babel 转换来编写一行代码。
这个,const [firstName,setFirstName] = useState<string>("")
但是,当我运行我的转换以插入此代码时,<brackets>
的周围都有额外的空间。所以我得到 useState < string > ("")
...
我觉得这可能是故意的代码格式。但是对于这个特定领域,我希望它不要这样做。我不希望操作符周围有额外的空间只用于我代码的这一部分.. 我怎样才能做到这一点?
这是我的转换/配置
types.variableDeclaration("const",[
types.variableDeclarator(
types.arrayPattern([
types.identifier("firstName"),types.identifier("setFirstName")
]),types.binaryExpression(
">",types.binaryExpression(
"<",types.identifier("useState"),types.identifier("string")
),types.parenthesizedExpression(types.stringLiteral(""))
)
)
]
)
"@babel/core": "^7.12.13",
"@babel/plugin-Syntax-typescript": "^7.12.13",
解决方法
如果您要进行类型注释,则需要创建类型注释 AST 节点,而不是 binaryExpression
和 parenthesizedExpression
等。 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,)
]);
综上所述,手动构建所有这些可能非常困难,因此根据您的需要,我会考虑使用 template
来完成,例如
const declNode = template.statement({ plugins: ["typescript"] }).ast`
const [firstName,setFirstName] = useState<string>();
`;
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。