node.js - TypeScript känner inte igen URLSearchParams som itererbar


Jag får följande fel när jag försöker bygga ett litet TypeScript-projekt med 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.

Jag försöker använda ett Node-inbyggt URLSearchParams-objekt i en enkel loop:

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

Node LTS-version 12-dokumentationen visar att metoden Symbol.iterator finns. Den fungerar i Node REPL.

Jag hittade ett stängt ärende i TypeScript-repot från 2017 som påstås ha löst detta fel. Men jag försökte också använda searchParams.entries() och validatorn kände inte igen det som en tillgänglig egenskap. Så det känns som att min TypeScript har en väldigt föråldrad definition för URLSearchParams. Kanske är detta bara ett paketproblem, men jag vet inte hur jag ska undersöka vidare. Filen yarn.lock visar lämpliga nodtyper:

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

När jag tittar på de lokala kopiorna av Typescript-definitionsfilerna ser jag tillägget av Iterable-relaterade egenskaper i lib.dom.iterable.d.ts (som nämnts i det stängda GitHub-ärendet). På något sätt ignoreras de.

Jag kan skriva om min kod för att använda searchParams.forEach() istället, men jag skulle ändå vilja förstå vad som går fel.

Svar #1

Som det ursprungliga inlägget spekulerar i används inte de ytterligare definitionerna i lib.dom.iterable.d.ts. Projektets TypeScript-konfiguration i tsconfig.json måste referera till den filen:

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

Med detta förstår TypeScript nu iteratorrelaterade egenskaper för URLSearchParams och omkring 50 andra typer som refereras i den filen. Jag antar att separationen är relaterad till TypeScripts bakåtkompatibilitet med äldre ECMAScript-varianter, men jag vet inte.

Relaterade artiklar