Closed
Description
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
Related Issues:
No direct related issues found.