如何在 typescript npm 包中加载一个 js 配置文件,该文件将来只会由包用户编写

how to load a js config file in a typescript npm package that will only be written in the future by the package user

我正在尝试在 Typescript 中编写一个 NPM 包,它应该作为 CLI 工具使用。

为简单起见,假设该包将从开发人员使用该包编写的 config.js 文件中获取默认导出,并将其打印在控制台中。

因此开发人员将:

  1. 使用 export default 'hello world'
  2. 创建一个 config.js 文件
  3. 键入 npx someLibrary 并在终端中看到“hello world”。

这个用例在我使用过的工具中很常见,比如 babel、jest 和 webpack。虽然我已经克服了一些技术挑战,但我仍然停留在如何在 Typescript 中获取未来的 config.js 文件。

我尝试采用的方法是使用动态导入。编译器不允许它,因为配置文件在编码时不存在。代码是这样的:

main();

async function main(): Promise<void> {
  const config = await import("./config.js");
  console.log(config);  
}

这会导致编译器错误:Cannot find module './config.js' or its corresponding type declarations.ts(2307)

我的问题是:我如何告诉 typescript 导入将在未来创建并且仅在运行时可用的配置文件?

如果那不可能,我如何在 Typescript 程序中使用该配置文件的内容?

My question is: how can I tell typescript to import the config file that will be created in the future and be available only during runtime?

一个。要获得快速解决方案,您可以简单地将 @ts-ignore 放在导入上方的行中。这应该忽略编译错误,并且在运行时应该相应地导入文件。

b。或者,您也可以使用 require('./config.js') 而不是使用导入。这也应该消除编译错误。

c。对于更合适的解决方案,您可以考虑使用函数在运行时读取文件。您可以考虑使用的两件事是 fetchfs

获取

fetch('./config.js')
  .then(response => response.text())
  .then(text => console.log(text))

fs

import fs from 'fs'
const data = fs.readFileSync('./config.js', 'utf8')
console.log(data)