Skip to content

Commit 15737c2

Browse files
committed
Fixes #33457
1 parent 344dba8 commit 15737c2

File tree

6 files changed

+81
-2
lines changed

6 files changed

+81
-2
lines changed

src/lib/es5.d.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1466,7 +1466,7 @@ type ConstructorParameters<T extends new (...args: any) => any> = T extends new
14661466
/**
14671467
* Obtain the return type of a function type
14681468
*/
1469-
type ReturnType<T extends (...args: any) => any> = T extends (...args: any) => infer R ? R : any;
1469+
type ReturnType<T extends (...args: any) => any> = T extends (...args: never) => infer R ? R : any;
14701470

14711471
/**
14721472
* Obtain the return type of a constructor function type

tests/baselines/reference/inferTypes1.errors.txt

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -237,4 +237,12 @@ tests/cases/conformance/types/conditional/inferTypes1.ts(145,40): error TS2322:
237237
const result = invoker('test', true)({ test: (a: boolean) => 123 })
238238

239239
type Foo2<A extends any[]> = ReturnType<(...args: A) => string>;
240+
241+
// Repros from #33457
242+
243+
type T82 = ReturnType<(arg: never) => string>; // string
244+
type T83 = ReturnType<(arg: never) => void>; // void
245+
type T84 = ReturnType<(arg0: never, arg1: any, arg2: never, arg3: string) => void>; // void
246+
type T85 = ReturnType<(...args : never) => number>; // number
247+
type T86 = ReturnType<(...args : never[]) => number>; // number
240248

tests/baselines/reference/inferTypes1.js

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -177,6 +177,14 @@ function invoker <K extends string | number | symbol, A extends any[]> (key: K,
177177
const result = invoker('test', true)({ test: (a: boolean) => 123 })
178178

179179
type Foo2<A extends any[]> = ReturnType<(...args: A) => string>;
180+
181+
// Repros from #33457
182+
183+
type T82 = ReturnType<(arg: never) => string>; // string
184+
type T83 = ReturnType<(arg: never) => void>; // void
185+
type T84 = ReturnType<(arg0: never, arg1: any, arg2: never, arg3: string) => void>; // void
186+
type T85 = ReturnType<(...args : never) => number>; // number
187+
type T86 = ReturnType<(...args : never[]) => number>; // number
180188

181189

182190
//// [inferTypes1.js]

tests/baselines/reference/inferTypes1.symbols

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -740,3 +740,33 @@ type Foo2<A extends any[]> = ReturnType<(...args: A) => string>;
740740
>args : Symbol(args, Decl(inferTypes1.ts, 177, 41))
741741
>A : Symbol(A, Decl(inferTypes1.ts, 177, 10))
742742

743+
// Repros from #33457
744+
745+
type T82 = ReturnType<(arg: never) => string>; // string
746+
>T82 : Symbol(T82, Decl(inferTypes1.ts, 177, 64))
747+
>ReturnType : Symbol(ReturnType, Decl(lib.es5.d.ts, --, --))
748+
>arg : Symbol(arg, Decl(inferTypes1.ts, 181, 23))
749+
750+
type T83 = ReturnType<(arg: never) => void>; // void
751+
>T83 : Symbol(T83, Decl(inferTypes1.ts, 181, 46))
752+
>ReturnType : Symbol(ReturnType, Decl(lib.es5.d.ts, --, --))
753+
>arg : Symbol(arg, Decl(inferTypes1.ts, 182, 23))
754+
755+
type T84 = ReturnType<(arg0: never, arg1: any, arg2: never, arg3: string) => void>; // void
756+
>T84 : Symbol(T84, Decl(inferTypes1.ts, 182, 44))
757+
>ReturnType : Symbol(ReturnType, Decl(lib.es5.d.ts, --, --))
758+
>arg0 : Symbol(arg0, Decl(inferTypes1.ts, 183, 23))
759+
>arg1 : Symbol(arg1, Decl(inferTypes1.ts, 183, 35))
760+
>arg2 : Symbol(arg2, Decl(inferTypes1.ts, 183, 46))
761+
>arg3 : Symbol(arg3, Decl(inferTypes1.ts, 183, 59))
762+
763+
type T85 = ReturnType<(...args : never) => number>; // number
764+
>T85 : Symbol(T85, Decl(inferTypes1.ts, 183, 83))
765+
>ReturnType : Symbol(ReturnType, Decl(lib.es5.d.ts, --, --))
766+
>args : Symbol(args, Decl(inferTypes1.ts, 184, 23))
767+
768+
type T86 = ReturnType<(...args : never[]) => number>; // number
769+
>T86 : Symbol(T86, Decl(inferTypes1.ts, 184, 51))
770+
>ReturnType : Symbol(ReturnType, Decl(lib.es5.d.ts, --, --))
771+
>args : Symbol(args, Decl(inferTypes1.ts, 185, 23))
772+

tests/baselines/reference/inferTypes1.types

Lines changed: 26 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -84,7 +84,7 @@ type T18 = ReturnType<Function>; // Error
8484
>T18 : any
8585

8686
type T19<T extends any[]> = ReturnType<(x: string, ...args: T) => T[]>; // T[]
87-
>T19 : T[]
87+
>T19 : ReturnType<(x: string, ...args: T) => T[]>
8888
>x : string
8989
>args : T
9090

@@ -467,3 +467,28 @@ type Foo2<A extends any[]> = ReturnType<(...args: A) => string>;
467467
>Foo2 : string
468468
>args : A
469469

470+
// Repros from #33457
471+
472+
type T82 = ReturnType<(arg: never) => string>; // string
473+
>T82 : string
474+
>arg : never
475+
476+
type T83 = ReturnType<(arg: never) => void>; // void
477+
>T83 : void
478+
>arg : never
479+
480+
type T84 = ReturnType<(arg0: never, arg1: any, arg2: never, arg3: string) => void>; // void
481+
>T84 : void
482+
>arg0 : never
483+
>arg1 : any
484+
>arg2 : never
485+
>arg3 : string
486+
487+
type T85 = ReturnType<(...args : never) => number>; // number
488+
>T85 : number
489+
>args : never
490+
491+
type T86 = ReturnType<(...args : never[]) => number>; // number
492+
>T86 : number
493+
>args : never[]
494+

tests/cases/conformance/types/conditional/inferTypes1.ts

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -179,3 +179,11 @@ function invoker <K extends string | number | symbol, A extends any[]> (key: K,
179179
const result = invoker('test', true)({ test: (a: boolean) => 123 })
180180

181181
type Foo2<A extends any[]> = ReturnType<(...args: A) => string>;
182+
183+
// Repros from #33457
184+
185+
type T82 = ReturnType<(arg: never) => string>; // string
186+
type T83 = ReturnType<(arg: never) => void>; // void
187+
type T84 = ReturnType<(arg0: never, arg1: any, arg2: never, arg3: string) => void>; // void
188+
type T85 = ReturnType<(...args : never) => number>; // number
189+
type T86 = ReturnType<(...args : never[]) => number>; // number

0 commit comments

Comments
 (0)