Skip to content

Inferred return type of generic function with specialized arguments is unknown #40111

Closed
@kol-93

Description

@kol-93

TypeScript Version: from 3.5.1 to 4.0.0-beta

Search Terms:
is:issue is:open return type generic unknown

Code

declare function f<T>(x: T): T;
declare function g(x: number): number;

type F = typeof f; // type F = <T>(x: T) => T;
type G = typeof g; // type G = (x: number) => number;

type TypedReturn<Fn extends (...args: any[]) => any, Args extends any[]> = Fn extends <A extends Args>(...args: A) => infer R ? R : never;
type TypedReturn1<Fn extends (arg: any) => any, Arg> = Fn extends <A extends Arg>(arg: A) => infer R ? R : never;

type FR = TypedReturn<F, [number]>;
// expected: type FR = number;
// actual:   type FR = unknown;

type GR = TypedReturn<G, [number]>;
// expected: type GR = number;
// actual:   type GR = number;

type FR1 = TypedReturn1<F, number>;
// expected: type FR1 = number;
// actual:   type FR1 = unknown;

type GR1 = TypedReturn1<G, number>;
// expected: type GR1 = number;
// actual:   type GR1 = number;

// These types are proofs of a bug
type F_Infer_OK = F extends (...args: [number]) => number ? true : false;
// type F_Infer_OK = true;
type F_Infer1_OK = F extends (x: number) => number ? true : false;
// type F_Infer1_OK = true;

type F_Infer_FAIL_1 = F extends (...args: [number]) => string ? true : false;
// type F_Infer_FAIL_1 = false;
type F_Infer1_FAIL_1 = F extends (x: number) => string ? true : false;
// type F_Infer1_FAIL_1 = false;

type F_Infer_FAIL_2 = F extends (...args: [string]) => number ? true : false;
// type F_Infer_FAIL_2 = false;
type F_Infer1_FAIL_2 = F extends (x: string) => number ? true : false;
// type F_Infer1_FAIL_2 = false;

Expected behavior:
See comments in Code section

Actual behavior:
See comments in Code section

Playground link

Related Issues:
No direct related issues found.

Metadata

Metadata

Assignees

Labels

DuplicateAn existing issue was already created

Type

No type

Projects

No projects

Relationships

None yet

Development

No branches or pull requests

Issue actions