【问题标题】:Typescript import ESM default exportTypescript 导入 ESM 默认导出
【发布时间】:2022-12-07 06:47:55
【问题描述】:

我觉得这是一个应该回答却找不到答案的问题。

我已将我的 TS 项目切换到 ESM。所以我的package.json现在有"type": "module"和我的tsconfig.json

 "target": "es2020",
 "lib": ["es2020"],
 "module": "node16",
 "moduleResolution": "Node16",
 "esModuleInterop": true, // Eases ESM support
 "types": ["node"],
 "allowSyntheticDefaultImports": true,
...

在大多数情况下,一切都很好,但有几个模块给我带来了麻烦。例如aedesmqemitterwait

import wait from 'wait'

await wait(1000) 

上面的代码“有效”,但 VSCode 红色强调了第二行错误的“等待”:

This expression is not callable.
  Type 'typeof import(".../node_modules/wait/wait")' has no call signatures.

我当然试过:

import * as wait from 'wait'

import { default as wait } from 'wait'

我认为我的 TS 配置中有相关的 ESM 设置。

我正在使用 TS 4.8.3 并使用所有这些麻烦的软件包中的最新版本。

我看到的大多数帖子似乎都在谈论esModuleInterop 等。

添加 .default 例如 wait.default() 会使错误消失但代码不会运行。似乎工作 here though.one

有任何想法吗?

更新

好的。这个错误让我有点失望——我通常看到 VSCode 告诉我安装 @types/... 或声明我做了什么。

declare module wait
declare module aedes
declare module mqemitter

但是我不认为这是解决方案。我实际上必须对 15-20 个模块和一些模块(如 ajv 完全在 TS 中完成)执行此操作,因为我将不得不以某种方式修改它们的整个类型定义 - 在旁注 ajv 因为我打电话它与构造函数 new Ajv() 产生了一个轻微的差异错误 his expression is not constructable.。有些问题看似相关,但目前还没有什么特别具体的。

这是一个sandbox

【问题讨论】:

  • 你需要esModuleInterop吗?如果删除它,mqemitter(CommonJS 模块)的导入将不再需要 .default 属性访问。
  • 我尝试删除并设置为 false - 相同的 w allowSyntheticDefaultImports 相关(我认为一个设置另一个)并且根本没有变化。
  • @morganney 事实证明,我没有运行并取消它的“默认”代码有效,但在 VSCode 中显示错误。添加“默认”会消除错误,但会导致代码无法运行。
  • @网络袋熊。我和你有完全一样的问题。你有没有找到解决办法?
  • 它与“moduleResolution”设置有关。它被设置为它应该的“NodeNext”,但如果我将其更改为“Node”,事情就会再次开始工作。看起来像是 TypeScript 错误。

标签: typescript es6-modules


【解决方案1】:

在我的例子中,对于 wait 和 ajv 等麻烦的模块,我将它们导入到一个 utils 文件中,然后使用 TS 类型重新导出,如下所示:

import wait from 'wait'

export const pause = wait as unknown as typeof wait.default 

【讨论】:

    猜你喜欢
    • 2019-04-03
    • 2018-10-14
    • 2020-04-30
    • 2016-06-19
    • 1970-01-01
    • 2021-06-01
    • 2017-02-01
    • 1970-01-01
    • 2021-03-03
    相关资源
    最近更新 更多