Skip to content

Generic function return type inference regression in 3.7-beta #33788

@dloehr

Description

@dloehr

TypeScript Version: 3.7.0-beta

Search Terms: 3.7-beta, inference, infer, return type

Code

interface Person {
  readonly age: number
  readonly firstName: string
}

declare function getProperty<K extends keyof Person>(name: K): Person[K]

interface Selector<Args extends any[], R> { (...args: Args): R }

type SelectorReturnType<
  Args extends any[],
  Fn extends Selector<Args, any>
> = Fn extends Selector<Args, infer R> ? R : never

declare function select<Args extends any[], Fn extends Selector<Args, any>>(
  selector: Fn,
  ...args: Args
): SelectorReturnType<Args, Fn>

const age = select(getProperty, 'age' as const)
const firstName = select(getProperty, 'firstName' as const)

Expected behavior:
The type of age should be inferred as number and the type of firstName should be string. This is how it works with TypeScript 3.6.3.

Actual behavior:
age and firstName are both string | number

Playground Link: https://www.typescriptlang.org/play/?ts=3.7-Beta#code/JYOwLgpgTgZghgYwgAgArQM4HsTIN4BQyyUEcAJjgDYCeycA5hAFzIgCuAtgEbQDcREmUohayGMCgYwAOTicWyaVFAMBAXwIFyEBFTilx7EAjDAcyJmFRQsAB2hgaAHgDSyCAA9IIchmQA1hA0WDBomDgAfAAUIPKKrgCUrOhSOADargC6AgSgkLCIKADKEFS6YFhQzgCCUAz+Xj5+9CA06VkANMgASpH4gtEAdCMGDax1Dcm9GlpODsil5aZVPRBg7FAgACo0Ds6Ck43eEL7+cG0dnYIAYrhNpy1LFVW19RjdFzSRBP0AvMg7h4TmdFmUXtUjt1QDBoL1+gB+XrIVggCAAN34Wh0egMKBgxlM5lwGHBpjeDWBzXOly6gPuIKeZMqkPenzakRiglJyxZrDu12IIyGYwwE3eBGmzxWUDWGy2u32UPpkVyCBw0noTGQAJ5FWiVhs9kcNG6ACJGBAzfR-OqQNJEgI7ZqJFJZPEdUpmQb1kaHFAnObXdI5AprXBbRqwI6CEA

Metadata

Metadata

Assignees

No one assigned

    Labels

    Working as IntendedThe behavior described is the intended behavior; this is not a bug

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions