我正在将我的react esri-传单转换成类型记录。该库要求用户将react-传单安装为peerDependency,并且它提供了对react传单版本3 (RLV3)以及react-传单版本2 (RLV2)的支持。对于默认组件,我可以简单地完成以下操作
import { createLayerComponent } from 'react-leaflet'但是,如果用户希望使用与RLV2兼容的组件,他们可以分别导入这些组件(可以随意查看库文档,看看如何导入)。大多数RLV2组件的开头都是这样的
import { withLeaflet, MapControl } from 'react-leaflet'在转换到类型记录时,这会引发一个错误。在开发这个库时,我安装了react传单,安装了最新的版本。withLeaflet和MapControl不再存在于该版本中。
为了解决这个问题,我遵循了这个答案中的建议“Node应用程序中相同npm包的两个版本”。这允许我将RLV2作为一个单独的包在我的源代码中通过将它混成'react-leaflet-v2'来处理,我可以这样做。
import { withLeaflet, MapControl } from 'react-leaflet-v2'太好了,现在打字稿很高兴,我可以把适当版本的react传单导入到适当的组件和类型是正确的。但是,当我使用tsc编译回js时,在我的V2组件中使用的包名仍然是'react-leaflet-v2'。
问题是,库的最终用户将使用RLV2或RLV3,并且在他们的项目中将简单地称为'react-leaflet'。库的编译文件需要能够找到'react-leaflet',而不是一些别名,而不管它们使用的版本是什么。
对于两个依赖版本,我如何在开发中维护类型安全,但允许我的用户不必担心它,这意味着只需安装他们想要使用的react传单,从库中导入正确的组件,并让组件在他们的项目中找到'react-leaflet'依赖?编译时可以告诉tsc将'react-leaflet-v2'重命名为'react-leaflet'吗?还有别的解决办法吗?
发布于 2021-04-23 21:30:07
所以我想出了个办法。这并不完美,但基本上:
使用Babel
我没有使用tsc传输我的ts文件,而是使用babel,仅用于那些已经别名节点模块导入的文件。我找到了babel-插件-转换-重命名-导入,它可以在编译时重命名导入。将它添加到标准的babel配置中,我有以下内容:
{
"presets": ["@babel/preset-env", "@babel/preset-typescript"],
"plugins": [
"@babel/plugin-proposal-object-rest-spread",
"transform-react-jsx",
"@babel/plugin-proposal-class-properties",
[
"transform-rename-import", // <--- solution here
{ "original": "react-leaflet-v2", "replacement": "react-leaflet" }
]
]
}这是一个标准设置的反应类型记录文件,一些额外的贝拉和哨声。正如你所看到的,它将把任何从“react传单-v2”的进口重命名为“Reactive-传单”。
考虑到我的项目被组织成将所有这些RLV2文件都放在自己的文件夹中,我编写了一个脚本来使用常规的tsc命令编译所有常规组件,但是使用babel与该配置一起转换v2目录中的文件。然后,我使用tsc --emitDeclarationOnly true为v2文件编写.d.ts文件。
注意,这是很好的,因为我的库没有从‘react传单-v2’中导入任何纯类型的脚本声明,这意味着没有import { TypeOrInterfaceOrEnum } from 'react-leaflet-v2' -所有导入都只是组件或函数。如果我从react传单-v2中导入了类型信息,那么我的.d.ts文件中仍然会有.d.ts,而且我还需要对这些信息进行某种程度的转换。也许babel也能做到这一点,但我现在没有必要去探索它。
https://stackoverflow.com/questions/67216805
复制相似问题