typescript - Hvorfor lar TS meg vente på en streng?


Denne koden (som bruker promisifisert fs) har åpenbart gale parenteser:

    const jsonSource = await fs.readFile(planFilePath).toString();

Intensjonen var:

    const jsonSource = (await fs.readFile(planFilePath)).toString();

Og spørsmålet er: hvorfor kompilerer egentlig den gale versjonen? Den gale versjonen omgjør løftet til en streng til "[object Promise]", og deretter anvendes await-operatøren på den strengen. TS vet at toString()-metoden til et Promise<string>-objekt returnerer en streng. TS vet også at du ikke kan await’e en streng, bare et løfte. Så hvorfor kompilerer dette?

Svar #1

Dette kompilerer fordi nesten alle verdier kan ventes på, prøv å kjøre eksemplet nedenfor i nettleseren din.

(async function() {
  console.log(await Promise.resolve(console.log('🎉')));
  const test = 'testing';
  console.log(await test);
  console.log(await 33);
}());

dokumentasjonen sier denne oppførselen:

Hvis verdien ikke er et løfte, konverterer den verdien til et løst løfte, og venter på det.

docs: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/await

Relaterte artikler