Преобразование типов 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",

Я смог найти только информацию о том, как добавить дополнительный интервал, но не удалить его.

1 ответ

Если вы пытаетесь создать аннотацию типа, вам нужно создать узел 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>();
`;
Другие вопросы по тегам