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
