Skip to content

Type inference regression on function calls not saved to variables, due to #61668 #62071

@shicks

Description

@shicks

🔎 Search Terms

61668 inference overload regression tuple

🕗 Version & Regression Information

⏯ Playground Link

https://www.typescriptlang.org/play/?ts=5.9.0-beta#code/PTAEGIDYEZMgOUBjAFgQwHYHMCmBnUAFxR1AEsMAzHAJxwyVMpoHsBbUAbQwFc2AjWgBpQeQjQpYAukRagAFLwG0APmInYAlJykAoACY4kAGzR1QlHg0JkWGULkIA5PvM0AuUAAVWbMnhwAHiVBGgA+AG4DI1NzS2tbe0cAZXE3Tx92fyD1SUjokzMmKyQbO1AeAIAVHgAHYxx5QjqGz24+UJFc7CkPUAA3FjJ9KKQ7MVBa0ABeb19sgDo6PBZjfsadTQXienk3GbC5rICFtGNjeU5HFzY3ERS0zV6tnYx5Spwa+pxNKKA

💻 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.

Metadata

Metadata

Assignees

No one assigned

    Labels

    Help WantedYou can do thisPossible ImprovementThe current behavior isn't wrong, but it's possible to see that it might be better in some cases

    Type

    No type

    Projects

    No projects

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions