Skip to content

Contextual inference for nested calls that return constructors #57747

Open

Description

#54813 attempted to make this work, but exposed an underlying bug that caused too many instantiations. Once that bug is fixed, the code in #54813 should be re-applied if possible.

Here's an example of something that should work, but doesn't:

// @strict: true
// @noEmit: true

interface Action<TContext> {
  new (ctx: TContext): void;
}

declare class AssignAction<TContext> {
  constructor(ctx: TContext);
}

declare function assign<TContext>(
  assigner: (ctx: TContext) => void
): {
  new (ctx: TContext): AssignAction<TContext>;
}

declare function createMachine<TContext>(config: {
  context: TContext;
  entry: Action<TContext>;
}): void;

createMachine({
  context: { count: 0 },
  entry: assign((ctx) => { ctx }),
});

ctx should have type { count: number }, inferred from the context of assign, but doesn't.

Activity

  1. sandersn commented on Mar 12, 2024

    @sandersn
    MemberAuthor

    Mateusz Burzyński (@Andarist) this tracks your original fix until the performance bug which it exposed is fixed.

  2. weswigham commented on Mar 12, 2024

    @weswigham
    Member

    (For future readers:) #57710 was the issue that prompted the revert, and whatever test case we can distill from it should be considered alongside the repro for the original issue in the OP.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    Domain: check: Type InferenceRelated to type inference performed during signature resolution or `infer` type resolutionHelp 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