TypeScript 无法将 URLSearchParams 识别为可迭代的

gis*_*d22 3 node.js typescript

尝试使用 yarn & webpack 构建一个小型 TypeScript 项目时出现以下错误:

TS2549: Type 'URLSearchParams' is not an array type or a string type or does not have a '[Symbol.iterator]()' method that returns an iterator.
Run Code Online (Sandbox Code Playgroud)

我正在尝试URLSearchParams在一个简单的循环中使用 Node 内置对象:

TS2549: Type 'URLSearchParams' is not an array type or a string type or does not have a '[Symbol.iterator]()' method that returns an iterator.
Run Code Online (Sandbox Code Playgroud)

Node LTS 版本 12 文档显示Symbol.iterator 方法存在。它适用于 Node REPL。

我在 2017 年的 TypeScript 存储库中发现了一个已解决的问题,据说可以解决此错误。但我也尝试使用searchParams.entries(),但验证器未将其识别为可用属性。所以感觉我的 TypeScript 对 URLSearchParams 的定义非常过时。也许这只是一个包装问题,但我不知道如何进一步调查。该yarn.lock文件显示了适当的节点类型:

"@types/node@^12":
  version "12.12.53"
  resolved "https://registry.yarnpkg.com/@types/node/-/node-12.12.53.tgz#be0d375933c3d15ef2380dafb3b0350ea7021129"
  integrity sha512-51MYTDTyCziHb70wtGNFRwB4l+5JNvdqzFSkbDvpbftEgVUBEE+T5f7pROhWMp/fxp07oNIEQZd5bbfAH22ohQ==

typescript@^3.9.7:
  version "3.9.7"
  resolved "https://registry.yarnpkg.com/typescript/-/typescript-3.9.7.tgz#98d600a5ebdc38f40cb277522f12dc800e9e25fa"
  integrity sha512-BLbiRkiBzAwsjut4x/dsibSTB6yWpwT5qWmC2OfuCg3GgVQCSgMs4vEctYPhsaGtd0AeuuHMkjZ2h2WG8MSzRw==
Run Code Online (Sandbox Code Playgroud)

当我查看 Typescript 定义文件的本地副本时,我看到添加了与 Iterable 相关的属性lib.dom.iterable.d.ts(如已关闭的 GitHub 问题中所述)。不知何故,这些都被忽略了。

我可以改写我的代码来使用searchParams.forEach(),但我想知道到底出了什么问题。

gis*_*d22 5

正如原始帖子所推测的那样,lib.dom.iterable.d.ts没有使用中的附加定义。项目的 TypeScript 配置tsconfig.json必须引用该文件:

"lib": [
  "dom",
  "dom.iterable",
  "es2019"
]
Run Code Online (Sandbox Code Playgroud)

有了这个,TypeScript 现在可以理解 URLSearchParams 和该文件中引用的大约 50 种其他类型的迭代器相关属性。我认为这种分离与 TypeScript 与旧 ECMAScript 风格的向后兼容性有关,但我不知道。