3

我正在用 TypeScript 编写一个 Babel 插件,并且一直在努力寻找很多这样做的示例或文档。例如,我正在编写一个带有以下签名的访问者插件:

export default function myPlugin({ types: t }: typeof babel): PluginObj {

我从以下几种类型中获得:

import type { PluginObj, PluginPass } from '@babel/core';

困扰我的部分{ types: t }: typeof babel是来自

import type * as babel from '@babel/core';

我在网上找到的几个例子都在使用这个,但这真的应该是这样输入的吗?

4

1 回答 1

2

根据 2019 年的此公开 Babel问题,看起来 Babel 的类型分为'@babel/core@babel/types。与其他一些 Node 的“类型”包不同,不要混淆的一件事不是@babel/typesBabel 的“类型”包,而是包含手动构建 AST 和检查 AST 节点类型的方法。因此,它们基本上是具有不同目标的不同软件包。

Babel 包的挑战在于它们似乎使用命名空间(通配符)导入,而且包本身似乎没有任何类型。

解决此问题的一种快速方法:

import type * as BabelCoreNamespace from '@babel/core';
import type * as BabelTypesNamespace from '@babel/types';
import type { PluginObj } from '@babel/core';

export type Babel = typeof BabelCoreNamespace;
export type BabelTypes = typeof BabelTypesNamespace;

export default function myPlugin(babel: Babel): PluginObj {
    // Some plugin code here
}

这使得代码更具可读性,直到这个开放的 Babel 问题得到修复。

于 2021-07-18T17:08:36.843 回答