Skip to content

Type parameter inference regression in 3.4 #30442

Closed

Description

@ark120202

TypeScript Version: 3.4.0-rc

Search Terms: Type parameters, generics, inference, regression

Code

const foo = <T>() => {};
const assign = <T, U>(a: T, b: U) => Object.assign(a, b);
const result: (() => void) & { foo: any } = assign(() => {}, { foo });

Expected behavior:

No error

Actual behavior:

Argument of type '{ foo: <T>() => void; }' is not assignable to parameter of type '(() => void) & { foo: any; }'.
  Type '{ foo: <T>() => void; }' is not assignable to type '() => void'.
    Type '{ foo: <T>() => void; }' provides no match for the signature '(): void'.

Playground Link:
https://www.typescriptlang.org/play/#src=const%20foo%20%3D%20%3CT%3E()%20%3D%3E%20%7B%7D%3B%0D%0Aconst%20assign%20%3D%20%3CT%2C%20U%3E(a%3A%20T%2C%20b%3A%20U)%20%3D%3E%20Object.assign(a%2C%20b)%3B%0D%0Aconst%20result%3A%20(()%20%3D%3E%20void)%20%26%20%7B%20foo%3A%20any%20%7D%20%3D%20assign(()%20%3D%3E%20%7B%7D%2C%20%7B%20foo%20%7D)%3B

Related Issues:


Removing <T> from foo makes this code valid.

Activity

  1. ark120202 commented on Apr 2, 2019

    @ark120202
    Author

    Reproducible in 3.4.1

  2. RyanCavanaugh commented on Apr 9, 2019

    @RyanCavanaugh
    Member

    Anders Hejlsberg (@ahejlsberg) contextual typing strikes again? Moving the initializer to its own expression resolves its problem

    const foo = <T,>() => {};
    const assign = <T, U>(a: T, b: U) => Object.assign(a, b);
    // No error
    const res = assign(() => {}, { foo });
    const result: (() => void) & { foo: any } = res;
  3. ahejlsberg commented on Apr 10, 2019

    @ahejlsberg
    Member

    This is an effect of #29847. Previously we'd only make inferences to single naked type parameters in unions and intersections. We now infer to each naked type parameter. That works well for union types, but not for intersection types as this example illustrates. I think we should revert to the previous behavior for intersection types and only infer to multiple naked type parameters in union types.

  4. added
    BugA bug in TypeScript
    and removed
    Needs InvestigationThis issue needs a team member to investigate its status.
    on Apr 10, 2019
  5. locked as resolved and limited conversation to collaborators on Oct 21, 2025
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Labels

BugA bug in TypeScriptFixedA PR has been merged for this issue

Type

No type

Projects

No projects

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions