Microsoft/TypeScript
View on GitHubType inference regression on function calls not saved to variables, due to #61668
Open
#62,071 opened on Jul 15, 2025
Domain: check: Type InferenceHelp WantedPossible Improvement
Description
🔎 Search Terms
61668 inference overload regression tuple
🕗 Version & Regression Information
- This changed in commit or PR #61668
⏯ Playground Link
💻 Code
declare function getNum(): Promise<number>;
declare function getStr(): Promise<string>;
declare function useTuple(tuple: [number, string]): void;
const p = Promise.resolve([]).then(() => Promise.all([getNum(), getStr()])).then(useTuple);
🙁 Actual behavior
The Promise.all infers to Promise<(number|string)[]>.
🙂 Expected behavior
The Promise.all should infer Promise<[number, string]>.
Additional information about the issue
This only happens when the Promise.all call is directly returned. If I instead write
const p = Promise.all([getNum(), getStr()]);
return p;
then it infers the tuple correctly again, even without doing anything that would suggest it should infer the type differently.
This PR also impacted inference of enums: in another example, I pass {mode: new Subject(Mode.A)} into a function that fails because it infers Subject<Mode.A> while if I save a temporary const mode = new Subject(Mode.A); then it infers Subject<Mode> and passes.