CommonJS + node-fetch 不可用的 Intellisense 类型

Intellisense types unavailable with CommonJS + node-fetch

问题

使用流行的 node-fetch 库,Intellisense 不理解 fetch() 的 return 值。

Vim 与 coc:

VSCode 中的相同内容:

对于大多数其他库,我有类型完成功能,但这个不起作用。

我尝试过的东西

  1. 添加了 jsconfig.jsontsconfig.json 个文件
  2. 调查了导出一个@types/index.d.ts
  3. 的包
  4. 尝试安装 @types/node-fetch,它也经常过时
  5. 转换为 import 语法,有效

预期结果

正如我提到的,更改为 import 语法可以解决问题,但我希望它也能与 require 一起使用。

我如何使用 CommonJS 在这个库上进行类型补全?

const fetch = require('node-fetch');

fetch('https://github.com/')
    .then(res => res.text())
    .then(body => console.log(body));

这没问题,你查过文档了吗?

这对我有用:

import node_fetch = require("node-fetch");
const fetch = node_fetch.default;

fetch('https://github.com/')
    .then(res => res.text())
    .then(body => console.log(body));

(见https://www.typescriptlang.org/docs/handbook/modules.html

请注意,我认为必须有更好的方法来获取默认导入...

解决方案

const fetch = require('node-fetch').default

说明

为了弥合 CommonJS 和 ES 模块语法之间的根本差异,require('node-fetch') returns 具有这种形状的对象:

注意 node-fetch type definition 确实 fetch() 函数导出为顶层,但也导出了 default 属性为了与 ES 模块语法兼容。使用此 属性 可修复自动完成问题。

这对我来说仍然像是一个错误,但这个解决方法确实解决了这个问题。