Skip to content

Commit cff586d

Browse files
committed
Test skip overloads w/too-short function params
1. Update changed baseline. 2. Add a new test with baseline.
1 parent 83fdecf commit cff586d

5 files changed

+394
-4
lines changed
Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,59 @@
1+
//// [contextualTypingOfTooShortOverloads.ts]
2+
// small repro from #11875
3+
var use: Overload;
4+
use((req, res) => {});
5+
6+
interface Overload {
7+
(handler1: (req1: string) => void): void;
8+
(handler2: (req2: number, res2: number) => void): void;
9+
}
10+
// larger repro from #11875
11+
let app: MyApp;
12+
app.use((err: any, req, res, next) => { return; });
13+
14+
15+
interface MyApp {
16+
use: IRouterHandler<this> & IRouterMatcher<this>;
17+
}
18+
19+
interface IRouterHandler<T> {
20+
(...handlers: RequestHandler[]): T;
21+
(...handlers: RequestHandlerParams[]): T;
22+
}
23+
24+
interface IRouterMatcher<T> {
25+
(path: PathParams, ...handlers: RequestHandler[]): T;
26+
(path: PathParams, ...handlers: RequestHandlerParams[]): T;
27+
}
28+
29+
type PathParams = string | RegExp | (string | RegExp)[];
30+
type RequestHandlerParams = RequestHandler | ErrorRequestHandler | (RequestHandler | ErrorRequestHandler)[];
31+
32+
interface RequestHandler {
33+
(req: Request, res: Response, next: NextFunction): any;
34+
}
35+
36+
interface ErrorRequestHandler {
37+
(err: any, req: Request, res: Response, next: NextFunction): any;
38+
}
39+
40+
interface Request {
41+
method: string;
42+
}
43+
44+
interface Response {
45+
statusCode: number;
46+
}
47+
48+
interface NextFunction {
49+
(err?: any): void;
50+
}
51+
52+
53+
//// [contextualTypingOfTooShortOverloads.js]
54+
// small repro from #11875
55+
var use;
56+
use(function (req, res) { });
57+
// larger repro from #11875
58+
var app;
59+
app.use(function (err, req, res, next) { return; });
Lines changed: 139 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,139 @@
1+
=== tests/cases/compiler/contextualTypingOfTooShortOverloads.ts ===
2+
// small repro from #11875
3+
var use: Overload;
4+
>use : Symbol(use, Decl(contextualTypingOfTooShortOverloads.ts, 1, 3))
5+
>Overload : Symbol(Overload, Decl(contextualTypingOfTooShortOverloads.ts, 2, 22))
6+
7+
use((req, res) => {});
8+
>use : Symbol(use, Decl(contextualTypingOfTooShortOverloads.ts, 1, 3))
9+
>req : Symbol(req, Decl(contextualTypingOfTooShortOverloads.ts, 2, 5))
10+
>res : Symbol(res, Decl(contextualTypingOfTooShortOverloads.ts, 2, 9))
11+
12+
interface Overload {
13+
>Overload : Symbol(Overload, Decl(contextualTypingOfTooShortOverloads.ts, 2, 22))
14+
15+
(handler1: (req1: string) => void): void;
16+
>handler1 : Symbol(handler1, Decl(contextualTypingOfTooShortOverloads.ts, 5, 5))
17+
>req1 : Symbol(req1, Decl(contextualTypingOfTooShortOverloads.ts, 5, 16))
18+
19+
(handler2: (req2: number, res2: number) => void): void;
20+
>handler2 : Symbol(handler2, Decl(contextualTypingOfTooShortOverloads.ts, 6, 5))
21+
>req2 : Symbol(req2, Decl(contextualTypingOfTooShortOverloads.ts, 6, 16))
22+
>res2 : Symbol(res2, Decl(contextualTypingOfTooShortOverloads.ts, 6, 29))
23+
}
24+
// larger repro from #11875
25+
let app: MyApp;
26+
>app : Symbol(app, Decl(contextualTypingOfTooShortOverloads.ts, 9, 3))
27+
>MyApp : Symbol(MyApp, Decl(contextualTypingOfTooShortOverloads.ts, 10, 51))
28+
29+
app.use((err: any, req, res, next) => { return; });
30+
>app.use : Symbol(MyApp.use, Decl(contextualTypingOfTooShortOverloads.ts, 13, 17))
31+
>app : Symbol(app, Decl(contextualTypingOfTooShortOverloads.ts, 9, 3))
32+
>use : Symbol(MyApp.use, Decl(contextualTypingOfTooShortOverloads.ts, 13, 17))
33+
>err : Symbol(err, Decl(contextualTypingOfTooShortOverloads.ts, 10, 9))
34+
>req : Symbol(req, Decl(contextualTypingOfTooShortOverloads.ts, 10, 18))
35+
>res : Symbol(res, Decl(contextualTypingOfTooShortOverloads.ts, 10, 23))
36+
>next : Symbol(next, Decl(contextualTypingOfTooShortOverloads.ts, 10, 28))
37+
38+
39+
interface MyApp {
40+
>MyApp : Symbol(MyApp, Decl(contextualTypingOfTooShortOverloads.ts, 10, 51))
41+
42+
use: IRouterHandler<this> & IRouterMatcher<this>;
43+
>use : Symbol(MyApp.use, Decl(contextualTypingOfTooShortOverloads.ts, 13, 17))
44+
>IRouterHandler : Symbol(IRouterHandler, Decl(contextualTypingOfTooShortOverloads.ts, 15, 1))
45+
>IRouterMatcher : Symbol(IRouterMatcher, Decl(contextualTypingOfTooShortOverloads.ts, 20, 1))
46+
}
47+
48+
interface IRouterHandler<T> {
49+
>IRouterHandler : Symbol(IRouterHandler, Decl(contextualTypingOfTooShortOverloads.ts, 15, 1))
50+
>T : Symbol(T, Decl(contextualTypingOfTooShortOverloads.ts, 17, 25))
51+
52+
(...handlers: RequestHandler[]): T;
53+
>handlers : Symbol(handlers, Decl(contextualTypingOfTooShortOverloads.ts, 18, 5))
54+
>RequestHandler : Symbol(RequestHandler, Decl(contextualTypingOfTooShortOverloads.ts, 28, 108))
55+
>T : Symbol(T, Decl(contextualTypingOfTooShortOverloads.ts, 17, 25))
56+
57+
(...handlers: RequestHandlerParams[]): T;
58+
>handlers : Symbol(handlers, Decl(contextualTypingOfTooShortOverloads.ts, 19, 5))
59+
>RequestHandlerParams : Symbol(RequestHandlerParams, Decl(contextualTypingOfTooShortOverloads.ts, 27, 56))
60+
>T : Symbol(T, Decl(contextualTypingOfTooShortOverloads.ts, 17, 25))
61+
}
62+
63+
interface IRouterMatcher<T> {
64+
>IRouterMatcher : Symbol(IRouterMatcher, Decl(contextualTypingOfTooShortOverloads.ts, 20, 1))
65+
>T : Symbol(T, Decl(contextualTypingOfTooShortOverloads.ts, 22, 25))
66+
67+
(path: PathParams, ...handlers: RequestHandler[]): T;
68+
>path : Symbol(path, Decl(contextualTypingOfTooShortOverloads.ts, 23, 5))
69+
>PathParams : Symbol(PathParams, Decl(contextualTypingOfTooShortOverloads.ts, 25, 1))
70+
>handlers : Symbol(handlers, Decl(contextualTypingOfTooShortOverloads.ts, 23, 22))
71+
>RequestHandler : Symbol(RequestHandler, Decl(contextualTypingOfTooShortOverloads.ts, 28, 108))
72+
>T : Symbol(T, Decl(contextualTypingOfTooShortOverloads.ts, 22, 25))
73+
74+
(path: PathParams, ...handlers: RequestHandlerParams[]): T;
75+
>path : Symbol(path, Decl(contextualTypingOfTooShortOverloads.ts, 24, 5))
76+
>PathParams : Symbol(PathParams, Decl(contextualTypingOfTooShortOverloads.ts, 25, 1))
77+
>handlers : Symbol(handlers, Decl(contextualTypingOfTooShortOverloads.ts, 24, 22))
78+
>RequestHandlerParams : Symbol(RequestHandlerParams, Decl(contextualTypingOfTooShortOverloads.ts, 27, 56))
79+
>T : Symbol(T, Decl(contextualTypingOfTooShortOverloads.ts, 22, 25))
80+
}
81+
82+
type PathParams = string | RegExp | (string | RegExp)[];
83+
>PathParams : Symbol(PathParams, Decl(contextualTypingOfTooShortOverloads.ts, 25, 1))
84+
>RegExp : Symbol(RegExp, Decl(lib.d.ts, --, --), Decl(lib.d.ts, --, --))
85+
>RegExp : Symbol(RegExp, Decl(lib.d.ts, --, --), Decl(lib.d.ts, --, --))
86+
87+
type RequestHandlerParams = RequestHandler | ErrorRequestHandler | (RequestHandler | ErrorRequestHandler)[];
88+
>RequestHandlerParams : Symbol(RequestHandlerParams, Decl(contextualTypingOfTooShortOverloads.ts, 27, 56))
89+
>RequestHandler : Symbol(RequestHandler, Decl(contextualTypingOfTooShortOverloads.ts, 28, 108))
90+
>ErrorRequestHandler : Symbol(ErrorRequestHandler, Decl(contextualTypingOfTooShortOverloads.ts, 32, 1))
91+
>RequestHandler : Symbol(RequestHandler, Decl(contextualTypingOfTooShortOverloads.ts, 28, 108))
92+
>ErrorRequestHandler : Symbol(ErrorRequestHandler, Decl(contextualTypingOfTooShortOverloads.ts, 32, 1))
93+
94+
interface RequestHandler {
95+
>RequestHandler : Symbol(RequestHandler, Decl(contextualTypingOfTooShortOverloads.ts, 28, 108))
96+
97+
(req: Request, res: Response, next: NextFunction): any;
98+
>req : Symbol(req, Decl(contextualTypingOfTooShortOverloads.ts, 31, 5))
99+
>Request : Symbol(Request, Decl(contextualTypingOfTooShortOverloads.ts, 36, 1))
100+
>res : Symbol(res, Decl(contextualTypingOfTooShortOverloads.ts, 31, 18))
101+
>Response : Symbol(Response, Decl(contextualTypingOfTooShortOverloads.ts, 40, 1))
102+
>next : Symbol(next, Decl(contextualTypingOfTooShortOverloads.ts, 31, 33))
103+
>NextFunction : Symbol(NextFunction, Decl(contextualTypingOfTooShortOverloads.ts, 44, 1))
104+
}
105+
106+
interface ErrorRequestHandler {
107+
>ErrorRequestHandler : Symbol(ErrorRequestHandler, Decl(contextualTypingOfTooShortOverloads.ts, 32, 1))
108+
109+
(err: any, req: Request, res: Response, next: NextFunction): any;
110+
>err : Symbol(err, Decl(contextualTypingOfTooShortOverloads.ts, 35, 5))
111+
>req : Symbol(req, Decl(contextualTypingOfTooShortOverloads.ts, 35, 14))
112+
>Request : Symbol(Request, Decl(contextualTypingOfTooShortOverloads.ts, 36, 1))
113+
>res : Symbol(res, Decl(contextualTypingOfTooShortOverloads.ts, 35, 28))
114+
>Response : Symbol(Response, Decl(contextualTypingOfTooShortOverloads.ts, 40, 1))
115+
>next : Symbol(next, Decl(contextualTypingOfTooShortOverloads.ts, 35, 43))
116+
>NextFunction : Symbol(NextFunction, Decl(contextualTypingOfTooShortOverloads.ts, 44, 1))
117+
}
118+
119+
interface Request {
120+
>Request : Symbol(Request, Decl(contextualTypingOfTooShortOverloads.ts, 36, 1))
121+
122+
method: string;
123+
>method : Symbol(Request.method, Decl(contextualTypingOfTooShortOverloads.ts, 38, 19))
124+
}
125+
126+
interface Response {
127+
>Response : Symbol(Response, Decl(contextualTypingOfTooShortOverloads.ts, 40, 1))
128+
129+
statusCode: number;
130+
>statusCode : Symbol(Response.statusCode, Decl(contextualTypingOfTooShortOverloads.ts, 42, 20))
131+
}
132+
133+
interface NextFunction {
134+
>NextFunction : Symbol(NextFunction, Decl(contextualTypingOfTooShortOverloads.ts, 44, 1))
135+
136+
(err?: any): void;
137+
>err : Symbol(err, Decl(contextualTypingOfTooShortOverloads.ts, 47, 5))
138+
}
139+
Lines changed: 143 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,143 @@
1+
=== tests/cases/compiler/contextualTypingOfTooShortOverloads.ts ===
2+
// small repro from #11875
3+
var use: Overload;
4+
>use : Overload
5+
>Overload : Overload
6+
7+
use((req, res) => {});
8+
>use((req, res) => {}) : void
9+
>use : Overload
10+
>(req, res) => {} : (req: number, res: number) => void
11+
>req : number
12+
>res : number
13+
14+
interface Overload {
15+
>Overload : Overload
16+
17+
(handler1: (req1: string) => void): void;
18+
>handler1 : (req1: string) => void
19+
>req1 : string
20+
21+
(handler2: (req2: number, res2: number) => void): void;
22+
>handler2 : (req2: number, res2: number) => void
23+
>req2 : number
24+
>res2 : number
25+
}
26+
// larger repro from #11875
27+
let app: MyApp;
28+
>app : MyApp
29+
>MyApp : MyApp
30+
31+
app.use((err: any, req, res, next) => { return; });
32+
>app.use((err: any, req, res, next) => { return; }) : MyApp
33+
>app.use : IRouterHandler<MyApp> & IRouterMatcher<MyApp>
34+
>app : MyApp
35+
>use : IRouterHandler<MyApp> & IRouterMatcher<MyApp>
36+
>(err: any, req, res, next) => { return; } : (err: any, req: any, res: any, next: any) => void
37+
>err : any
38+
>req : any
39+
>res : any
40+
>next : any
41+
42+
43+
interface MyApp {
44+
>MyApp : MyApp
45+
46+
use: IRouterHandler<this> & IRouterMatcher<this>;
47+
>use : IRouterHandler<this> & IRouterMatcher<this>
48+
>IRouterHandler : IRouterHandler<T>
49+
>IRouterMatcher : IRouterMatcher<T>
50+
}
51+
52+
interface IRouterHandler<T> {
53+
>IRouterHandler : IRouterHandler<T>
54+
>T : T
55+
56+
(...handlers: RequestHandler[]): T;
57+
>handlers : RequestHandler[]
58+
>RequestHandler : RequestHandler
59+
>T : T
60+
61+
(...handlers: RequestHandlerParams[]): T;
62+
>handlers : RequestHandlerParams[]
63+
>RequestHandlerParams : RequestHandlerParams
64+
>T : T
65+
}
66+
67+
interface IRouterMatcher<T> {
68+
>IRouterMatcher : IRouterMatcher<T>
69+
>T : T
70+
71+
(path: PathParams, ...handlers: RequestHandler[]): T;
72+
>path : PathParams
73+
>PathParams : PathParams
74+
>handlers : RequestHandler[]
75+
>RequestHandler : RequestHandler
76+
>T : T
77+
78+
(path: PathParams, ...handlers: RequestHandlerParams[]): T;
79+
>path : PathParams
80+
>PathParams : PathParams
81+
>handlers : RequestHandlerParams[]
82+
>RequestHandlerParams : RequestHandlerParams
83+
>T : T
84+
}
85+
86+
type PathParams = string | RegExp | (string | RegExp)[];
87+
>PathParams : PathParams
88+
>RegExp : RegExp
89+
>RegExp : RegExp
90+
91+
type RequestHandlerParams = RequestHandler | ErrorRequestHandler | (RequestHandler | ErrorRequestHandler)[];
92+
>RequestHandlerParams : RequestHandlerParams
93+
>RequestHandler : RequestHandler
94+
>ErrorRequestHandler : ErrorRequestHandler
95+
>RequestHandler : RequestHandler
96+
>ErrorRequestHandler : ErrorRequestHandler
97+
98+
interface RequestHandler {
99+
>RequestHandler : RequestHandler
100+
101+
(req: Request, res: Response, next: NextFunction): any;
102+
>req : Request
103+
>Request : Request
104+
>res : Response
105+
>Response : Response
106+
>next : NextFunction
107+
>NextFunction : NextFunction
108+
}
109+
110+
interface ErrorRequestHandler {
111+
>ErrorRequestHandler : ErrorRequestHandler
112+
113+
(err: any, req: Request, res: Response, next: NextFunction): any;
114+
>err : any
115+
>req : Request
116+
>Request : Request
117+
>res : Response
118+
>Response : Response
119+
>next : NextFunction
120+
>NextFunction : NextFunction
121+
}
122+
123+
interface Request {
124+
>Request : Request
125+
126+
method: string;
127+
>method : string
128+
}
129+
130+
interface Response {
131+
>Response : Response
132+
133+
statusCode: number;
134+
>statusCode : number
135+
}
136+
137+
interface NextFunction {
138+
>NextFunction : NextFunction
139+
140+
(err?: any): void;
141+
>err : any
142+
}
143+

tests/baselines/reference/partiallyAnnotatedFunctionInferenceError.errors.txt

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
1-
tests/cases/conformance/types/contextualTypes/partiallyAnnotatedFunction/partiallyAnnotatedFunctionInferenceError.ts(12,11): error TS2345: Argument of type '(t1: D, t2: D, t3: any) => void' is not assignable to parameter of type '(t: D, t1: D) => void'.
2-
tests/cases/conformance/types/contextualTypes/partiallyAnnotatedFunction/partiallyAnnotatedFunctionInferenceError.ts(13,11): error TS2345: Argument of type '(t1: D, t2: D, t3: any) => void' is not assignable to parameter of type '(t: D, t1: D) => void'.
1+
tests/cases/conformance/types/contextualTypes/partiallyAnnotatedFunction/partiallyAnnotatedFunctionInferenceError.ts(12,11): error TS2345: Argument of type '(t1: D, t2: C, t3: any) => void' is not assignable to parameter of type '(t: C, t1: C) => void'.
2+
tests/cases/conformance/types/contextualTypes/partiallyAnnotatedFunction/partiallyAnnotatedFunctionInferenceError.ts(13,11): error TS2345: Argument of type '(t1: C, t2: D, t3: any) => void' is not assignable to parameter of type '(t: C, t1: C) => void'.
33
tests/cases/conformance/types/contextualTypes/partiallyAnnotatedFunction/partiallyAnnotatedFunctionInferenceError.ts(14,11): error TS2345: Argument of type '(t1: C, t2: C, t3: D) => void' is not assignable to parameter of type '(t: C, t1: C) => void'.
44

55

@@ -17,10 +17,10 @@ tests/cases/conformance/types/contextualTypes/partiallyAnnotatedFunction/partial
1717
// more args
1818
testError((t1: D, t2, t3) => {})
1919
~~~~~~~~~~~~~~~~~~~~~
20-
!!! error TS2345: Argument of type '(t1: D, t2: D, t3: any) => void' is not assignable to parameter of type '(t: D, t1: D) => void'.
20+
!!! error TS2345: Argument of type '(t1: D, t2: C, t3: any) => void' is not assignable to parameter of type '(t: C, t1: C) => void'.
2121
testError((t1, t2: D, t3) => {})
2222
~~~~~~~~~~~~~~~~~~~~~
23-
!!! error TS2345: Argument of type '(t1: D, t2: D, t3: any) => void' is not assignable to parameter of type '(t: D, t1: D) => void'.
23+
!!! error TS2345: Argument of type '(t1: C, t2: D, t3: any) => void' is not assignable to parameter of type '(t: C, t1: C) => void'.
2424
testError((t1, t2, t3: D) => {})
2525
~~~~~~~~~~~~~~~~~~~~~
2626
!!! error TS2345: Argument of type '(t1: C, t2: C, t3: D) => void' is not assignable to parameter of type '(t: C, t1: C) => void'.

0 commit comments

Comments
 (0)