Skip to content

Generic type inference failedΒ #56855

Description

@LiST-GIT

πŸ”Ž Search Terms

Generics

πŸ•— Version & Regression Information

⏯ Playground Link

https://www.typescriptlang.org/play?#code/GYVwdgxgLglg9mABKSAeAUIriAqBGAGk2xwGZEBTADygrABMBnRAb0QG0BrCgTwC5EjKACcYYAOYBdAQAoICWjQH4AlIgC8APkQA3ODHqIAvkWy4ALBtYnEAeluIAwnAC2LurAmI4IKIigAFjDMjBTQ8EhwwIjy9BSILgCG3MwwfgDucMKciAAOwnC5FMIANjwAdOiaMvSJUIkCLMRYOMp4ANzNiADSyuQAZLhBjDg8Raj4iINkmp1Gak1G6OgoEDJNZq2sXWYARvsCeABMpKZm2ImXMguIwhRQIMJIpC-txmdYJl292+fY+7s5ApqFAFjs-jEEIw4CUKOUSnBxECwIooOVLolripOhDzvIwNDYfDEcjUeUAdjwX9AsFyhB6dccRCvrj6WsbizsF95u0gA

πŸ’» Code

function func<
    T1,
    T3 extends { [key: string]: (context: T1) => void },
    T4 = {}, // Commenting out this section of code makes it work properly.
>(data: {
    T: T1;
    K: T3 & ThisType<T1 & T3>;
}) {
}

func({
    T: {
        bbb: 123,
        aaa() { return 333; },
    },
    K: {
        bbb(context) {
            console.log(context.aaa());
            console.log(context.bbb);
            this.ccc();
        },
        ccc() { },
    },
});

πŸ™ Actual behavior

display an error message:

'context' is of type 'unknown'.
'context' is of type 'unknown'.
'T4' is declared but its value is never read.
'data' is declared but its value is never read.

πŸ™‚ Expected behavior

The type of 'context' should already be determined; it shouldn't be 'unknown'.

Additional information about the issue

No response

Activity

  1. changed the title [-]generic type inference failed[/-] [+]Generic type inference failed[/+] on Dec 24, 2023
  2. jfet97 commented on Jan 3, 2024

    @jfet97
    Contributor

    The following seems to work:

    function func<
        T1,
        T3 extends { [key: string]: (context: T1) => void },
        T4 = {},
    >(data: {
        T: T1;
        K: T3 & ThisType<T1 & T3>;
    }) {
    }
    
    func({
        T: {
            bbb: 123,
            aaa: () => { return 333; }, // <-- here lies the difference: arrow instead of method
        },
        K: {
            bbb(context) {
                console.log(context.aaa());
                console.log(context.bbb);
                this.ccc();
            },
            ccc() { },
        },
    });

    Playground

  3. Andarist commented on Jan 4, 2024

    @Andarist
    Contributor

    This likely belongs to this umbrella issue: #47599

  4. jfet97 commented on Jan 4, 2024

    @jfet97
    Contributor

    The problem is the following if inside instantiateContextualType:

    // If no inferences have been made, and none of the type parameters for which we are inferring
    // specify default types, nothing is gained from instantiating as type parameters would just be
    // replaced with their constraints similar to the apparent type.
    if (
      inferenceContext &&
      contextFlags! & ContextFlags.Signature &&
      some(inferenceContext.inferences, hasInferenceCandidatesOrDefault)
    ) {
        // For contextual signatures we incorporate all inferences made so far, e.g. from return
        // types as well as arguments to the left in a function call.
        return instantiateInstantiableTypes(contextualType, inferenceContext.nonFixingMapper);
     }

    The condition results true at the wrong time, too eagerly as far as I understand it, therefore stuff gets instantiated with some default types.

    If you change the condition in one of the two following ways you solve this specific issue, but you get failing baselines:

    1. !some(inferenceContext.inferences, hasInferenceCandidatesOrDefault) seems somewhat more related with the above comment (?), but you get too many failing baselines
    2. every(inferenceContext.inferences, hasInferenceCandidatesOrDefault) just a couple of failing baselines, but one of them is about contextual inference and, guess what, it works here but not there anymore
  5. mkantor commented on Jun 8, 2026

    @mkantor
    Contributor

    This seems to have been fixed by TypeScript 6.0. The provided example no longer errors and context is now inferred as { bbb: number; aaa(): 333 }. I'm guessing that #62243 did the trick.

  6. RyanCavanaugh commented on Sep 19, 2026

    @RyanCavanaugh
    Member

    This is fixed by PR #62243. The original object-literal method form produced context: unknown and TS2339 errors in 5.9.3 and 6.0.0-dev.20251210; it is clean from 6.0.0-dev.20251211, including 6.0.3 and the current native compiler.

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

    BugA bug in TypeScriptDomain: check: Type InferenceRelated to type inference performed during signature resolution or `infer` type resolutionFixedA PR has been merged for this issueHelp WantedYou can do this

    Type

    No type

    Projects

    No projects

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions