node.js - TypeScript no reconoce URLSearchParams como iterable
Estoy recibiendo el siguiente error al intentar construir un pequeño proyecto de TypeScript con yarn y webpack:
TS2549: Type 'URLSearchParams' is not an array type or a string type or does not have a '[Symbol.iterator]()' method that returns an iterator.
Estoy intentando usar un objeto URLSearchParams incorporado de Node en un bucle simple:
for (let [name, value] of searchParams) {
//do stuff
}
La documentación de la versión LTS 12 de Node muestra que el método Symbol.iterator existe. Funciona en el REPL de Node.
Encontré un problema cerrado en el repositorio de TypeScript de 2017 que supuestamente resolvía este error. Pero también intenté usar searchParams.entries() y el validador no lo reconoció como una propiedad disponible. Así que parece que mi TypeScript tiene una definición muy desactualizada para URLSearchParams. Tal vez esto sea solo un problema de empaquetado, pero no sé cómo investigar más a fondo. El archivo yarn.lock muestra los tipos de nodo apropiados:
"@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==
Cuando miro las copias locales de los archivos de definición de Typescript, veo la adición de propiedades relacionadas con Iterable en lib.dom.iterable.d.ts (como se menciona en ese problema cerrado de GitHub). De alguna manera, esos están siendo ignorados.
Puedo reescribir mi código para usar searchParams.forEach() en su lugar, pero me gustaría entender qué está fallando de todos modos.
Respuesta #1
Como especula la publicación original, las definiciones adicionales en lib.dom.iterable.d.ts no se están utilizando. La configuración de TypeScript del proyecto en tsconfig.json tiene que hacer referencia a ese archivo:
"lib": [
"dom",
"dom.iterable",
"es2019"
]
Con esto, TypeScript ahora entiende las propiedades relacionadas con iteradores para URLSearchParams y alrededor de 50 otros tipos referenciados en ese archivo. Supongo que la separación está relacionada con la compatibilidad hacia atrás de TypeScript con versiones antiguas de ECMAScript, pero no lo sé.
