Pesquisa de site

node.js - TypeScript não reconhece URLSearchParams como iterável


Estou recebendo o seguinte erro ao tentar construir um pequeno projeto TypeScript com yarn & 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.

Estou tentando usar um objeto URLSearchParams nativo do Node em um loop simples:

for (let [name, value] of searchParams) {
    //do stuff
}

Os documentos da versão LTS 12 do Node mostram que o método Symbol.iterator existe. Ele funciona no REPL do Node.

Encontrei um issue fechado no repositório do TypeScript de 2017 que supostamente resolveu esse erro. Mas também tentei usar searchParams.entries() e o validador não o reconheceu como uma propriedade disponível. Então parece que meu TypeScript tem uma definição muito desatualizada para URLSearchParams. Talvez isso seja apenas um problema de empacotamento, mas não sei como investigar mais a fundo. O arquivo yarn.lock mostra tipos de node apropriados:

"@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==

Quando eu olho para as cópias locais dos arquivos de definição do Typescript, vejo a adição de propriedades relacionadas a Iterable em lib.dom.iterable.d.ts (como mencionado naquela issue fechada no GitHub). De alguma forma, elas estão sendo ignoradas.

Posso reescrever meu código para usar searchParams.forEach() em vez disso, mas eu gostaria de entender o que está dando errado de qualquer forma.

Resposta #1

Como o post original especula, as definições adicionais em lib.dom.iterable.d.ts não estão sendo utilizadas. A configuração do TypeScript do projeto em tsconfig.json precisa referenciar esse arquivo:

"lib": [
  "dom",
  "dom.iterable",
  "es2019"
]

Com isso, o TypeScript agora entende as propriedades relacionadas a iteradores para URLSearchParams e cerca de 50 outros tipos referenciados nesse arquivo. Eu suponho que a separação esteja relacionada à compatibilidade retroativa do TypeScript com versões mais antigas do ECMAScript, mas eu não sei.

Artigos relacionados