NodeJS 如何使用typescript支持同一模块的多个版本?

dl5txlt9  于 2022-12-12  发布在  Node.js
关注(0)|答案(2)|浏览(89)

我正在制作一个npm打印包。
它使用discord.js,但discord.js有两个主要版本:

  • 不一致. js 11.5
  • js v12.0.0-开发人员
    我希望我的模块支持这两个版本。我的意思是,用户可以安装他们想要的discord.js版本,包将使用好的代码。
    对于另一个项目,在javascript中(没有typescript),我使用以下代码:
const { version } = require("discord.js");
if(version === "12.0.0-dev"){
    // code for v12
} else {
    // code for v11
}

而且运行得很好。但是,使用typescript,由于打字的原因,它会更加复杂。实际上,discord.js在v11和v12中的打字是不一样的,所以我不能用这两个版本编译代码:

const { Guild, version } = require("discord.js");
if(version === "12.0.0-dev"){
    Guild.iconURL(); // for v12
} else {
    Guild.iconURL; // for v11
}

如果安装了v12,则会抛出iconURL() doesn't exist on Guild;如果安装了v11,则会抛出iconURL doesn't exist on Guild
有没有办法在同一个包中支持两个版本,而不用为每个版本创建一个分支?

xzabzqsa

xzabzqsa1#

虽然不是很理想,但您可以手动下载v11和v12的类型,并将模块名称更改为如下形式:

// discord.js@11.d.ts
declare module 'discord.js@11' {
  ...
}

// discord.js@12.d.ts
declare module 'discord.js@12' {
  ...
}

然后,您可以按如下方式导入类型:

import { Guild as Guild12, version } from "discord.js";
import { Guild as Guild11 } from "discord.js@11";

declare const guild: Guild11 | Guild12 // obviously wouldn't be declared like this in your actual code

// At the time of writing v12.0.2 has been released
if (version === "12.0.2") {
    (guild as Guild12).iconURL(); // for v12
} else {
    (guild as Guild11).iconURL; // for v11
}

您也可以定义类型保护:

function isV12(guild: Guild11 | Guild12): guild is Guild12 {
  return version === "12.0.2";
}

if (isV12(guild)) {
  guild.iconURL();
} else {
  guild.iconURL();
}

我尝试在package.json中使用discord@11和discord@12的别名,如下所示:

"devDependencies": {
  "discord.js11": "npm:discord.js@11.6.2",
  "discord.js12": "npm:discord.js@12.0.2"
}

但是我得到了这个错误:

import { Guild as Guild12, version } from "discord.js12";
//                                        ~~~~~~~~~~~~~~
// with pnpm:
// File '/path/to/project/node_modules/.pnpm/registry.npmjs.org/discord.js/12.0.2/node_modules/discord.js/typings/index.d.ts' is not a module. (ts2306)
// with npm:
// File '/path/to/project/node_modules/discord.js12/typings/index.d.ts' is not a module. (ts2306)
3htmauhk

3htmauhk2#

npm i formik-v2@npm:formik@2.0.0

yarn add formik-v2@npm:formik@2.0.0
然后您可以
import * from 'formik-v2'
https://medium.com/weekly-webtips/how-to-install-multiple-versions-of-the-same-package-in-npm-71c29b12e253

相关问题