【发布时间】: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,
...
在大多数情况下,一切都很好,但有几个模块给我带来了麻烦。例如aedes和mqemitter和wait
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 错误。