Skip to content

Commit 4027c38

Browse files
committed
Add tests
1 parent e72af80 commit 4027c38

File tree

3 files changed

+400
-0
lines changed

3 files changed

+400
-0
lines changed
Lines changed: 201 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,201 @@
1+
=== tests/cases/compiler/multiSignatureTypeInference.ts ===
2+
declare function f1(arg: boolean): string;
3+
>f1 : Symbol(f1, Decl(multiSignatureTypeInference.ts, 0, 0), Decl(multiSignatureTypeInference.ts, 0, 42), Decl(multiSignatureTypeInference.ts, 1, 56))
4+
>arg : Symbol(arg, Decl(multiSignatureTypeInference.ts, 0, 20))
5+
6+
declare function f1(arg1: number, arg2: number): number;
7+
>f1 : Symbol(f1, Decl(multiSignatureTypeInference.ts, 0, 0), Decl(multiSignatureTypeInference.ts, 0, 42), Decl(multiSignatureTypeInference.ts, 1, 56))
8+
>arg1 : Symbol(arg1, Decl(multiSignatureTypeInference.ts, 1, 20))
9+
>arg2 : Symbol(arg2, Decl(multiSignatureTypeInference.ts, 1, 33))
10+
11+
declare function f1(...args: string[]): string[];
12+
>f1 : Symbol(f1, Decl(multiSignatureTypeInference.ts, 0, 0), Decl(multiSignatureTypeInference.ts, 0, 42), Decl(multiSignatureTypeInference.ts, 1, 56))
13+
>args : Symbol(args, Decl(multiSignatureTypeInference.ts, 2, 20))
14+
15+
declare function f2(arg: unknown): unknown;
16+
>f2 : Symbol(f2, Decl(multiSignatureTypeInference.ts, 2, 49))
17+
>arg : Symbol(arg, Decl(multiSignatureTypeInference.ts, 4, 20))
18+
19+
declare function f3(): string;
20+
>f3 : Symbol(f3, Decl(multiSignatureTypeInference.ts, 4, 43))
21+
22+
type AllParams<T> =
23+
>AllParams : Symbol(AllParams, Decl(multiSignatureTypeInference.ts, 6, 30))
24+
>T : Symbol(T, Decl(multiSignatureTypeInference.ts, 8, 15))
25+
26+
T extends { (...a: infer A1): any, (...a: infer A2): any, (...a: infer A3): any, (...a: infer A4): any } ? A1 | A2 | A3 | A4 : never;
27+
>T : Symbol(T, Decl(multiSignatureTypeInference.ts, 8, 15))
28+
>a : Symbol(a, Decl(multiSignatureTypeInference.ts, 9, 17))
29+
>A1 : Symbol(A1, Decl(multiSignatureTypeInference.ts, 9, 28))
30+
>a : Symbol(a, Decl(multiSignatureTypeInference.ts, 9, 40))
31+
>A2 : Symbol(A2, Decl(multiSignatureTypeInference.ts, 9, 51))
32+
>a : Symbol(a, Decl(multiSignatureTypeInference.ts, 9, 63))
33+
>A3 : Symbol(A3, Decl(multiSignatureTypeInference.ts, 9, 74))
34+
>a : Symbol(a, Decl(multiSignatureTypeInference.ts, 9, 86))
35+
>A4 : Symbol(A4, Decl(multiSignatureTypeInference.ts, 9, 97))
36+
>A1 : Symbol(A1, Decl(multiSignatureTypeInference.ts, 9, 28))
37+
>A2 : Symbol(A2, Decl(multiSignatureTypeInference.ts, 9, 51))
38+
>A3 : Symbol(A3, Decl(multiSignatureTypeInference.ts, 9, 74))
39+
>A4 : Symbol(A4, Decl(multiSignatureTypeInference.ts, 9, 97))
40+
41+
type AllReturns<T> =
42+
>AllReturns : Symbol(AllReturns, Decl(multiSignatureTypeInference.ts, 9, 137))
43+
>T : Symbol(T, Decl(multiSignatureTypeInference.ts, 11, 16))
44+
45+
T extends { (...a: any[]): infer R1, (...a: any[]): infer R2, (...a: any[]): infer R3, (...a: any[]): infer R4 } ? R1 | R2 | R3 | R4 : never;
46+
>T : Symbol(T, Decl(multiSignatureTypeInference.ts, 11, 16))
47+
>a : Symbol(a, Decl(multiSignatureTypeInference.ts, 12, 17))
48+
>R1 : Symbol(R1, Decl(multiSignatureTypeInference.ts, 12, 36))
49+
>a : Symbol(a, Decl(multiSignatureTypeInference.ts, 12, 42))
50+
>R2 : Symbol(R2, Decl(multiSignatureTypeInference.ts, 12, 61))
51+
>a : Symbol(a, Decl(multiSignatureTypeInference.ts, 12, 67))
52+
>R3 : Symbol(R3, Decl(multiSignatureTypeInference.ts, 12, 86))
53+
>a : Symbol(a, Decl(multiSignatureTypeInference.ts, 12, 92))
54+
>R4 : Symbol(R4, Decl(multiSignatureTypeInference.ts, 12, 111))
55+
>R1 : Symbol(R1, Decl(multiSignatureTypeInference.ts, 12, 36))
56+
>R2 : Symbol(R2, Decl(multiSignatureTypeInference.ts, 12, 61))
57+
>R3 : Symbol(R3, Decl(multiSignatureTypeInference.ts, 12, 86))
58+
>R4 : Symbol(R4, Decl(multiSignatureTypeInference.ts, 12, 111))
59+
60+
type Params1 = AllParams<typeof f1>; // string[] | [arg: boolean] | [arg1: number, arg2: number]
61+
>Params1 : Symbol(Params1, Decl(multiSignatureTypeInference.ts, 12, 145))
62+
>AllParams : Symbol(AllParams, Decl(multiSignatureTypeInference.ts, 6, 30))
63+
>f1 : Symbol(f1, Decl(multiSignatureTypeInference.ts, 0, 0), Decl(multiSignatureTypeInference.ts, 0, 42), Decl(multiSignatureTypeInference.ts, 1, 56))
64+
65+
type Params2 = AllParams<typeof f2>; // [arg: unknown]
66+
>Params2 : Symbol(Params2, Decl(multiSignatureTypeInference.ts, 14, 36))
67+
>AllParams : Symbol(AllParams, Decl(multiSignatureTypeInference.ts, 6, 30))
68+
>f2 : Symbol(f2, Decl(multiSignatureTypeInference.ts, 2, 49))
69+
70+
type Params3 = AllParams<typeof f3>; // []
71+
>Params3 : Symbol(Params3, Decl(multiSignatureTypeInference.ts, 15, 36))
72+
>AllParams : Symbol(AllParams, Decl(multiSignatureTypeInference.ts, 6, 30))
73+
>f3 : Symbol(f3, Decl(multiSignatureTypeInference.ts, 4, 43))
74+
75+
type Returns1 = AllReturns<typeof f1> // string | number | string[]
76+
>Returns1 : Symbol(Returns1, Decl(multiSignatureTypeInference.ts, 16, 36))
77+
>AllReturns : Symbol(AllReturns, Decl(multiSignatureTypeInference.ts, 9, 137))
78+
>f1 : Symbol(f1, Decl(multiSignatureTypeInference.ts, 0, 0), Decl(multiSignatureTypeInference.ts, 0, 42), Decl(multiSignatureTypeInference.ts, 1, 56))
79+
80+
type Returns2 = AllReturns<typeof f2>; // unknown
81+
>Returns2 : Symbol(Returns2, Decl(multiSignatureTypeInference.ts, 18, 37))
82+
>AllReturns : Symbol(AllReturns, Decl(multiSignatureTypeInference.ts, 9, 137))
83+
>f2 : Symbol(f2, Decl(multiSignatureTypeInference.ts, 2, 49))
84+
85+
type Returns3 = AllReturns<typeof f3>; // string
86+
>Returns3 : Symbol(Returns3, Decl(multiSignatureTypeInference.ts, 19, 38))
87+
>AllReturns : Symbol(AllReturns, Decl(multiSignatureTypeInference.ts, 9, 137))
88+
>f3 : Symbol(f3, Decl(multiSignatureTypeInference.ts, 4, 43))
89+
90+
// Repro from #28867
91+
92+
type InferTwoOverloads<F extends Function> =
93+
>InferTwoOverloads : Symbol(InferTwoOverloads, Decl(multiSignatureTypeInference.ts, 20, 38))
94+
>F : Symbol(F, Decl(multiSignatureTypeInference.ts, 24, 23))
95+
>Function : Symbol(Function, Decl(lib.es5.d.ts, --, --), Decl(lib.es5.d.ts, --, --))
96+
97+
F extends { (...a1: infer A1): infer R1, (...a0: infer A0): infer R0 } ?
98+
>F : Symbol(F, Decl(multiSignatureTypeInference.ts, 24, 23))
99+
>a1 : Symbol(a1, Decl(multiSignatureTypeInference.ts, 25, 15))
100+
>A1 : Symbol(A1, Decl(multiSignatureTypeInference.ts, 25, 27))
101+
>R1 : Symbol(R1, Decl(multiSignatureTypeInference.ts, 25, 38))
102+
>a0 : Symbol(a0, Decl(multiSignatureTypeInference.ts, 25, 44))
103+
>A0 : Symbol(A0, Decl(multiSignatureTypeInference.ts, 25, 56))
104+
>R0 : Symbol(R0, Decl(multiSignatureTypeInference.ts, 25, 67))
105+
106+
[(...a1: A1) => R1, (...a0: A0) => R0] :
107+
>a1 : Symbol(a1, Decl(multiSignatureTypeInference.ts, 26, 6))
108+
>A1 : Symbol(A1, Decl(multiSignatureTypeInference.ts, 25, 27))
109+
>R1 : Symbol(R1, Decl(multiSignatureTypeInference.ts, 25, 38))
110+
>a0 : Symbol(a0, Decl(multiSignatureTypeInference.ts, 26, 25))
111+
>A0 : Symbol(A0, Decl(multiSignatureTypeInference.ts, 25, 56))
112+
>R0 : Symbol(R0, Decl(multiSignatureTypeInference.ts, 25, 67))
113+
114+
never;
115+
116+
type Expected = InferTwoOverloads<((x: string) => number) & (() => string)>; // [(x: string) => number, () => string]
117+
>Expected : Symbol(Expected, Decl(multiSignatureTypeInference.ts, 27, 10))
118+
>InferTwoOverloads : Symbol(InferTwoOverloads, Decl(multiSignatureTypeInference.ts, 20, 38))
119+
>x : Symbol(x, Decl(multiSignatureTypeInference.ts, 29, 36))
120+
121+
type JustOneSignature = InferTwoOverloads<((x: string) => number)>; // [(x: string) => number, (x: string) => number]
122+
>JustOneSignature : Symbol(JustOneSignature, Decl(multiSignatureTypeInference.ts, 29, 76))
123+
>InferTwoOverloads : Symbol(InferTwoOverloads, Decl(multiSignatureTypeInference.ts, 20, 38))
124+
>x : Symbol(x, Decl(multiSignatureTypeInference.ts, 31, 44))
125+
126+
type JustTheOtherSignature = InferTwoOverloads<(() => string)>; // [() => string, () => string]
127+
>JustTheOtherSignature : Symbol(JustTheOtherSignature, Decl(multiSignatureTypeInference.ts, 31, 67))
128+
>InferTwoOverloads : Symbol(InferTwoOverloads, Decl(multiSignatureTypeInference.ts, 20, 38))
129+
130+
// Repro from #28867
131+
132+
type Overloads<F> =
133+
>Overloads : Symbol(Overloads, Decl(multiSignatureTypeInference.ts, 33, 63))
134+
>F : Symbol(F, Decl(multiSignatureTypeInference.ts, 37, 15))
135+
136+
F extends {
137+
>F : Symbol(F, Decl(multiSignatureTypeInference.ts, 37, 15))
138+
139+
(...args: infer A1): infer R1
140+
>args : Symbol(args, Decl(multiSignatureTypeInference.ts, 39, 11))
141+
>A1 : Symbol(A1, Decl(multiSignatureTypeInference.ts, 39, 25))
142+
>R1 : Symbol(R1, Decl(multiSignatureTypeInference.ts, 39, 36))
143+
144+
(...args: infer A2): infer R2;
145+
>args : Symbol(args, Decl(multiSignatureTypeInference.ts, 40, 11))
146+
>A2 : Symbol(A2, Decl(multiSignatureTypeInference.ts, 40, 25))
147+
>R2 : Symbol(R2, Decl(multiSignatureTypeInference.ts, 40, 36))
148+
149+
} ? {rule: 2, variants: [A1, R1] | [A2, R2]} :
150+
>rule : Symbol(rule, Decl(multiSignatureTypeInference.ts, 41, 11))
151+
>variants : Symbol(variants, Decl(multiSignatureTypeInference.ts, 41, 19))
152+
>A1 : Symbol(A1, Decl(multiSignatureTypeInference.ts, 39, 25))
153+
>R1 : Symbol(R1, Decl(multiSignatureTypeInference.ts, 39, 36))
154+
>A2 : Symbol(A2, Decl(multiSignatureTypeInference.ts, 40, 25))
155+
>R2 : Symbol(R2, Decl(multiSignatureTypeInference.ts, 40, 36))
156+
157+
F extends {
158+
>F : Symbol(F, Decl(multiSignatureTypeInference.ts, 37, 15))
159+
160+
(...args: infer A1): infer R1;
161+
>args : Symbol(args, Decl(multiSignatureTypeInference.ts, 43, 11))
162+
>A1 : Symbol(A1, Decl(multiSignatureTypeInference.ts, 43, 25))
163+
>R1 : Symbol(R1, Decl(multiSignatureTypeInference.ts, 43, 36))
164+
165+
} ? {rule: 1, variants: [A1, R1]} :
166+
>rule : Symbol(rule, Decl(multiSignatureTypeInference.ts, 44, 11))
167+
>variants : Symbol(variants, Decl(multiSignatureTypeInference.ts, 44, 19))
168+
>A1 : Symbol(A1, Decl(multiSignatureTypeInference.ts, 43, 25))
169+
>R1 : Symbol(R1, Decl(multiSignatureTypeInference.ts, 43, 36))
170+
171+
never;
172+
173+
declare const ok1: Overloads<(x: number) => boolean>; // {rule: 2, variants: [[number], boolean]}
174+
>ok1 : Symbol(ok1, Decl(multiSignatureTypeInference.ts, 47, 13))
175+
>Overloads : Symbol(Overloads, Decl(multiSignatureTypeInference.ts, 33, 63))
176+
>x : Symbol(x, Decl(multiSignatureTypeInference.ts, 47, 30))
177+
178+
declare const ok2: Overloads<{(): 1; (x: number): 2}>; // {rule: 2, variants: [[], 1] | [[number], 2]}
179+
>ok2 : Symbol(ok2, Decl(multiSignatureTypeInference.ts, 49, 13))
180+
>Overloads : Symbol(Overloads, Decl(multiSignatureTypeInference.ts, 33, 63))
181+
>x : Symbol(x, Decl(multiSignatureTypeInference.ts, 49, 38))
182+
183+
declare const ok3: Overloads<() => boolean>; // {rule: 2, variants: [[], boolean] }
184+
>ok3 : Symbol(ok3, Decl(multiSignatureTypeInference.ts, 51, 13))
185+
>Overloads : Symbol(Overloads, Decl(multiSignatureTypeInference.ts, 33, 63))
186+
187+
declare const ok4: Overloads<(...args: unknown[]) => boolean>; // {rule: 2, variants: [unknown[], boolean] }
188+
>ok4 : Symbol(ok4, Decl(multiSignatureTypeInference.ts, 53, 13))
189+
>Overloads : Symbol(Overloads, Decl(multiSignatureTypeInference.ts, 33, 63))
190+
>args : Symbol(args, Decl(multiSignatureTypeInference.ts, 53, 30))
191+
192+
declare const ok5: Overloads<(x: unknown) => boolean>; // {rule: 2, variants: [[unknown], boolean] }
193+
>ok5 : Symbol(ok5, Decl(multiSignatureTypeInference.ts, 55, 13))
194+
>Overloads : Symbol(Overloads, Decl(multiSignatureTypeInference.ts, 33, 63))
195+
>x : Symbol(x, Decl(multiSignatureTypeInference.ts, 55, 30))
196+
197+
declare const ok6: Overloads<(x: any) => boolean>; // {rule: 2, variants: [[any], boolean] }
198+
>ok6 : Symbol(ok6, Decl(multiSignatureTypeInference.ts, 57, 13))
199+
>Overloads : Symbol(Overloads, Decl(multiSignatureTypeInference.ts, 33, 63))
200+
>x : Symbol(x, Decl(multiSignatureTypeInference.ts, 57, 30))
201+
Lines changed: 138 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,138 @@
1+
=== tests/cases/compiler/multiSignatureTypeInference.ts ===
2+
declare function f1(arg: boolean): string;
3+
>f1 : { (arg: boolean): string; (arg1: number, arg2: number): number; (...args: string[]): string[]; }
4+
>arg : boolean
5+
6+
declare function f1(arg1: number, arg2: number): number;
7+
>f1 : { (arg: boolean): string; (arg1: number, arg2: number): number; (...args: string[]): string[]; }
8+
>arg1 : number
9+
>arg2 : number
10+
11+
declare function f1(...args: string[]): string[];
12+
>f1 : { (arg: boolean): string; (arg1: number, arg2: number): number; (...args: string[]): string[]; }
13+
>args : string[]
14+
15+
declare function f2(arg: unknown): unknown;
16+
>f2 : (arg: unknown) => unknown
17+
>arg : unknown
18+
19+
declare function f3(): string;
20+
>f3 : () => string
21+
22+
type AllParams<T> =
23+
>AllParams : AllParams<T>
24+
25+
T extends { (...a: infer A1): any, (...a: infer A2): any, (...a: infer A3): any, (...a: infer A4): any } ? A1 | A2 | A3 | A4 : never;
26+
>a : A1
27+
>a : A2
28+
>a : A3
29+
>a : A4
30+
31+
type AllReturns<T> =
32+
>AllReturns : AllReturns<T>
33+
34+
T extends { (...a: any[]): infer R1, (...a: any[]): infer R2, (...a: any[]): infer R3, (...a: any[]): infer R4 } ? R1 | R2 | R3 | R4 : never;
35+
>a : any[]
36+
>a : any[]
37+
>a : any[]
38+
>a : any[]
39+
40+
type Params1 = AllParams<typeof f1>; // string[] | [arg: boolean] | [arg1: number, arg2: number]
41+
>Params1 : string[] | [arg: boolean] | [arg1: number, arg2: number]
42+
>f1 : { (arg: boolean): string; (arg1: number, arg2: number): number; (...args: string[]): string[]; }
43+
44+
type Params2 = AllParams<typeof f2>; // [arg: unknown]
45+
>Params2 : [arg: unknown]
46+
>f2 : (arg: unknown) => unknown
47+
48+
type Params3 = AllParams<typeof f3>; // []
49+
>Params3 : []
50+
>f3 : () => string
51+
52+
type Returns1 = AllReturns<typeof f1> // string | number | string[]
53+
>Returns1 : string | number | string[]
54+
>f1 : { (arg: boolean): string; (arg1: number, arg2: number): number; (...args: string[]): string[]; }
55+
56+
type Returns2 = AllReturns<typeof f2>; // unknown
57+
>Returns2 : unknown
58+
>f2 : (arg: unknown) => unknown
59+
60+
type Returns3 = AllReturns<typeof f3>; // string
61+
>Returns3 : string
62+
>f3 : () => string
63+
64+
// Repro from #28867
65+
66+
type InferTwoOverloads<F extends Function> =
67+
>InferTwoOverloads : InferTwoOverloads<F>
68+
69+
F extends { (...a1: infer A1): infer R1, (...a0: infer A0): infer R0 } ?
70+
>a1 : A1
71+
>a0 : A0
72+
73+
[(...a1: A1) => R1, (...a0: A0) => R0] :
74+
>a1 : A1
75+
>a0 : A0
76+
77+
never;
78+
79+
type Expected = InferTwoOverloads<((x: string) => number) & (() => string)>; // [(x: string) => number, () => string]
80+
>Expected : [(x: string) => number, () => string]
81+
>x : string
82+
83+
type JustOneSignature = InferTwoOverloads<((x: string) => number)>; // [(x: string) => number, (x: string) => number]
84+
>JustOneSignature : [(x: string) => number, (x: string) => number]
85+
>x : string
86+
87+
type JustTheOtherSignature = InferTwoOverloads<(() => string)>; // [() => string, () => string]
88+
>JustTheOtherSignature : [() => string, () => string]
89+
90+
// Repro from #28867
91+
92+
type Overloads<F> =
93+
>Overloads : Overloads<F>
94+
95+
F extends {
96+
(...args: infer A1): infer R1
97+
>args : A1
98+
99+
(...args: infer A2): infer R2;
100+
>args : A2
101+
102+
} ? {rule: 2, variants: [A1, R1] | [A2, R2]} :
103+
>rule : 2
104+
>variants : [A1, R1] | [A2, R2]
105+
106+
F extends {
107+
(...args: infer A1): infer R1;
108+
>args : A1
109+
110+
} ? {rule: 1, variants: [A1, R1]} :
111+
>rule : 1
112+
>variants : [A1, R1]
113+
114+
never;
115+
116+
declare const ok1: Overloads<(x: number) => boolean>; // {rule: 2, variants: [[number], boolean]}
117+
>ok1 : { rule: 2; variants: [[x: number], boolean]; }
118+
>x : number
119+
120+
declare const ok2: Overloads<{(): 1; (x: number): 2}>; // {rule: 2, variants: [[], 1] | [[number], 2]}
121+
>ok2 : { rule: 2; variants: [[], 1] | [[x: number], 2]; }
122+
>x : number
123+
124+
declare const ok3: Overloads<() => boolean>; // {rule: 2, variants: [[], boolean] }
125+
>ok3 : { rule: 2; variants: [[], boolean]; }
126+
127+
declare const ok4: Overloads<(...args: unknown[]) => boolean>; // {rule: 2, variants: [unknown[], boolean] }
128+
>ok4 : { rule: 2; variants: [unknown[], boolean]; }
129+
>args : unknown[]
130+
131+
declare const ok5: Overloads<(x: unknown) => boolean>; // {rule: 2, variants: [[unknown], boolean] }
132+
>ok5 : { rule: 2; variants: [[x: unknown], boolean]; }
133+
>x : unknown
134+
135+
declare const ok6: Overloads<(x: any) => boolean>; // {rule: 2, variants: [[any], boolean] }
136+
>ok6 : { rule: 2; variants: [[x: any], boolean]; }
137+
>x : any
138+

0 commit comments

Comments
 (0)