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
TypeScript Version: 3.7.0-beta
Search Terms: 3.7-beta, inference, infer, return type
Code
Expected behavior:
The type of
ageshould be inferred asnumberand the type offirstNameshould bestring. This is how it works with TypeScript 3.6.3.Actual behavior:
ageandfirstNameare bothstring | numberPlayground Link: https://www.typescriptlang.org/play/?ts=3.7-Beta#code/JYOwLgpgTgZghgYwgAgArQM4HsTIN4BQyyUEcAJjgDYCeycA5hAFzIgCuAtgEbQDcREmUohayGMCgYwAOTicWyaVFAMBAXwIFyEBFTilx7EAjDAcyJmFRQsAB2hgaAHgDSyCAA9IIchmQA1hA0WDBomDgAfAAUIPKKrgCUrOhSOADargC6AgSgkLCIKADKEFS6YFhQzgCCUAz+Xj5+9CA06VkANMgASpH4gtEAdCMGDax1Dcm9GlpODsil5aZVPRBg7FAgACo0Ds6Ck43eEL7+cG0dnYIAYrhNpy1LFVW19RjdFzSRBP0AvMg7h4TmdFmUXtUjt1QDBoL1+gB+XrIVggCAAN34Wh0egMKBgxlM5lwGHBpjeDWBzXOly6gPuIKeZMqkPenzakRiglJyxZrDu12IIyGYwwE3eBGmzxWUDWGy2u32UPpkVyCBw0noTGQAJ5FWiVhs9kcNG6ACJGBAzfR-OqQNJEgI7ZqJFJZPEdUpmQb1kaHFAnObXdI5AprXBbRqwI6CEA