Microsoft/TypeScript

TypeScript can't infer correct type from while loop if while condition is given a promise

Open

#55.300 aperta il 8 ago 2023

Vedi su GitHub
 (5 commenti) (0 reazioni) (0 assegnatari)TypeScript (6726 fork)batch import
Domain: check: Control FlowHelp WantedPossible Improvement

Metriche repository

Star
 (48.455 star)
Metriche merge PR
 (Merge medio 6g 17h) (9 PR mergiate in 30 g)

Descrizione

🔎 Search Terms

promise in while loop condition

🕗 Version & Regression Information

  • This is the behavior in every version I tried, and I reviewed the FAQ for entries about Bugs that aren't bugs

⏯ Playground Link

https://www.typescriptlang.org/play?ts=5.2.0-dev.20230807#code/GYVwdgxgLglg9mABAZwDYFN0AcAUBbZALkTBDwCN0AnASmIAUq48Zl0AeKKkdAPkQDeAKESIq6KCCpIw6AO6JGzVhy49eOAIaIAvPzZQAKjDzo4IKDhw1d-TTjXoaAGkQEaNIQF8hQzcgBPSERQSFgERHQAD008LAwARmsGJhY2dmQuGDAAc35hAEgMKEQAN01UHmJMqmycxAAfRHAAE3RgbPQWoQK5AAsYDEQHbidBHoLNOU0YErRMXABWAAZVzwKC8sr0XUQAckW9ifJxTQBrHp8C8UlpMoqeb19-IIgQ8Gh4JGjY+PQAJmSilSKgyWVy+R6xXu22q4PqTVa7U63V6AyGWmmsxQGGwOBWaxshU2Dx2On2h2OpwuBSuNykSC2jy8QA

💻 Code

function sleep(ms: number): Promise<true> {
  return new Promise<true>(a => setTimeout(() => a(true), ms))
}

async function example1(): Promise<string> {
	let value: string | undefined
	while (true) {
		await sleep(5000)
		value = '5'
		break
	}
	return value
}

async function example2(): Promise<string> {
	let value: string | undefined
	while (await sleep(5000)) {
		value = '5'
		break
	}
	return value
}

🙁 Actual behavior

In example2, TypeScript can't infer the type of value and that it should be now a string and not undefined simply because the Promise that returns true in the while loop has been moved to the while condition instead of the body of the while loop.

🙂 Expected behavior

The expected behaviour should be that TypeScript should be able to infer that it is still a string at the return statement just like in example1

Guida contributor