unplugin / unplugin-auto-import

Auto import APIs on-demand for Vite, Webpack and Rollup
MIT License
3.29k stars 198 forks source link

当前生成的 d.ts 文件无法为 commonjs 代码提供 typing #348

Open Nick-Hopps opened 1 year ago

Nick-Hopps commented 1 year ago

Describe the bug

以 webpack 为例,当前 tsup 生成的 d.ts 文件:

declare const _default: (options?: Options) => any;

export { _default as default };

然后我在 webpack 配置相关的脚本中(plugin.js)开启 checkJs

// @ts-check

const AutoImport = require('unplugin-auto-import/webpack');

function createWebpackPlugins({ isDev }) {
  // ...
  AutoImport({
    // 自动导入 vue/vux/vue-router 相关函数,如:ref, reactive, toRef 等
    imports: ['vue', 'vuex', 'vue-router'],
    eslintrc: { enabled: true },
  }),
}

此时 VSCode 会报错:

AutoImport
~~~~~~~~

This expression is not callable.
  Type 'typeof import(".../unplugin-auto-import/dist/webpack")' has no call signatures.ts(2349)

原因应该是 VSCode 的 ts 运行态把模块解析为 { default: AutoImport } 对象,理由是我把代码改成 const { default: AutoImport } = require('unplugin-auto-import/webpack'); 后就可以正常 typing 了。

然后我试着手动修改 d.ts 成这样:

declare function _default(options?: Options): any;
declare namespace _default {
  const temp: (options?: Options) => any;
  export { temp as default }
}

export = _default;

之后就可以正常 typing 了,不过由于这个 d.ts 文件是工具生成的,不知道有没有别的办法可以解决的。

Reproduction

noop

System Info

  System:
    OS: Windows 10 10.0.19044
    CPU: (12) x64 Intel(R) Core(TM) i7-8700 CPU @ 3.20GHz
    Memory: 14.28 GB / 31.78 GB
  Binaries:
    Node: 16.19.1 - ~\scoop\apps\nvm\current\nodejs\nodejs\node.EXE
    npm: 8.19.3 - ~\scoop\apps\nvm\current\nodejs\nodejs\npm.CMD

Used Package Manager

npm

Validations

Nick-Hopps commented 1 year ago

找了一下,发现是 rollup-plugin-dts 不支持 export = 的形式,所以解决方案是,要么手动写 d.ts 文件,要么等插件支持。

是否还有别的方式可以让 d.ts 同时支持 ESM 和 CJS 的呢?

xiaoxiangmoe commented 1 year ago

我也想知道,有啥类型的 bundler 能支持 export = 的形式 QAQ