Skip to content

Commit 2f5d9e9

Browse files
committed
Add tests
1 parent 5082d17 commit 2f5d9e9

File tree

4 files changed

+621
-0
lines changed

4 files changed

+621
-0
lines changed
Lines changed: 108 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,108 @@
1+
distributiveConditionalTypeConstraints.ts(4,9): error TS2322: Type 'boolean' is not assignable to type 'true'.
2+
distributiveConditionalTypeConstraints.ts(5,9): error TS2322: Type 'boolean' is not assignable to type 'false'.
3+
distributiveConditionalTypeConstraints.ts(10,9): error TS2322: Type 'IsArray<T>' is not assignable to type 'false'.
4+
Type 'true' is not assignable to type 'false'.
5+
distributiveConditionalTypeConstraints.ts(15,9): error TS2322: Type 'IsArray<T>' is not assignable to type 'false'.
6+
Type 'true' is not assignable to type 'false'.
7+
distributiveConditionalTypeConstraints.ts(19,9): error TS2322: Type 'IsArray<T>' is not assignable to type 'true'.
8+
Type 'false' is not assignable to type 'true'.
9+
10+
11+
==== distributiveConditionalTypeConstraints.ts (5 errors) ====
12+
type IsArray<T> = T extends unknown[] ? true : false;
13+
14+
function f1<T extends object>(x: IsArray<T>) {
15+
let t: true = x; // Error
16+
~
17+
!!! error TS2322: Type 'boolean' is not assignable to type 'true'.
18+
let f: false = x; // Error
19+
~
20+
!!! error TS2322: Type 'boolean' is not assignable to type 'false'.
21+
}
22+
23+
function f2<T extends unknown[]>(x: IsArray<T>) {
24+
let t: true = x;
25+
let f: false = x; // Error
26+
~
27+
!!! error TS2322: Type 'IsArray<T>' is not assignable to type 'false'.
28+
!!! error TS2322: Type 'true' is not assignable to type 'false'.
29+
}
30+
31+
function f3<T extends string[]>(x: IsArray<T>) {
32+
let t: true = x;
33+
let f: false = x; // Error
34+
~
35+
!!! error TS2322: Type 'IsArray<T>' is not assignable to type 'false'.
36+
!!! error TS2322: Type 'true' is not assignable to type 'false'.
37+
}
38+
39+
function f4<T extends Function>(x: IsArray<T>) {
40+
let t: true = x; // Error
41+
~
42+
!!! error TS2322: Type 'IsArray<T>' is not assignable to type 'true'.
43+
!!! error TS2322: Type 'false' is not assignable to type 'true'.
44+
let f: false = x;
45+
}
46+
47+
type ZeroOf<T> =
48+
T extends null ? null :
49+
T extends undefined ? undefined :
50+
T extends string ? "" :
51+
T extends number ? 0 :
52+
T extends boolean ? false :
53+
never;
54+
55+
function f10<T extends {}>(x: ZeroOf<T>) {
56+
let t: "" | 0 | false = x;
57+
}
58+
59+
// Modified repro from #30152
60+
61+
interface A { foo(): void; }
62+
interface B { bar(): void; }
63+
interface C { foo(): void, bar(): void }
64+
65+
function test1<T extends A>(y: T extends B ? number : string) {
66+
if (typeof y == 'string') {
67+
y; // T extends B ? number : string
68+
}
69+
else {
70+
y; // never
71+
}
72+
const newY: string | number = y;
73+
newY; // string
74+
}
75+
76+
function test2<T extends A>(y: T extends B ? string : number) {
77+
if (typeof y == 'string') {
78+
y; // never
79+
}
80+
else {
81+
y; // T extends B ? string : number
82+
}
83+
const newY: string | number = y;
84+
newY; // number
85+
}
86+
87+
function test3<T extends A>(y: T extends C ? number : string) {
88+
if (typeof y == 'string') {
89+
y; // (T extends C ? number : string) & string
90+
}
91+
else {
92+
y; // T extends C ? number : string
93+
}
94+
const newY: string | number = y;
95+
newY; // string | number
96+
}
97+
98+
function test4<T extends A>(y: T extends C ? string : number) {
99+
if (typeof y == 'string') {
100+
y; // (T extends C ? string : number) & string
101+
}
102+
else {
103+
y; // T extends C ? string : number
104+
}
105+
const newY: string | number = y;
106+
newY; // string | number
107+
}
108+
Lines changed: 225 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,225 @@
1+
//// [tests/cases/compiler/distributiveConditionalTypeConstraints.ts] ////
2+
3+
=== distributiveConditionalTypeConstraints.ts ===
4+
type IsArray<T> = T extends unknown[] ? true : false;
5+
>IsArray : Symbol(IsArray, Decl(distributiveConditionalTypeConstraints.ts, 0, 0))
6+
>T : Symbol(T, Decl(distributiveConditionalTypeConstraints.ts, 0, 13))
7+
>T : Symbol(T, Decl(distributiveConditionalTypeConstraints.ts, 0, 13))
8+
9+
function f1<T extends object>(x: IsArray<T>) {
10+
>f1 : Symbol(f1, Decl(distributiveConditionalTypeConstraints.ts, 0, 53))
11+
>T : Symbol(T, Decl(distributiveConditionalTypeConstraints.ts, 2, 12))
12+
>x : Symbol(x, Decl(distributiveConditionalTypeConstraints.ts, 2, 30))
13+
>IsArray : Symbol(IsArray, Decl(distributiveConditionalTypeConstraints.ts, 0, 0))
14+
>T : Symbol(T, Decl(distributiveConditionalTypeConstraints.ts, 2, 12))
15+
16+
let t: true = x; // Error
17+
>t : Symbol(t, Decl(distributiveConditionalTypeConstraints.ts, 3, 7))
18+
>x : Symbol(x, Decl(distributiveConditionalTypeConstraints.ts, 2, 30))
19+
20+
let f: false = x; // Error
21+
>f : Symbol(f, Decl(distributiveConditionalTypeConstraints.ts, 4, 7))
22+
>x : Symbol(x, Decl(distributiveConditionalTypeConstraints.ts, 2, 30))
23+
}
24+
25+
function f2<T extends unknown[]>(x: IsArray<T>) {
26+
>f2 : Symbol(f2, Decl(distributiveConditionalTypeConstraints.ts, 5, 1))
27+
>T : Symbol(T, Decl(distributiveConditionalTypeConstraints.ts, 7, 12))
28+
>x : Symbol(x, Decl(distributiveConditionalTypeConstraints.ts, 7, 33))
29+
>IsArray : Symbol(IsArray, Decl(distributiveConditionalTypeConstraints.ts, 0, 0))
30+
>T : Symbol(T, Decl(distributiveConditionalTypeConstraints.ts, 7, 12))
31+
32+
let t: true = x;
33+
>t : Symbol(t, Decl(distributiveConditionalTypeConstraints.ts, 8, 7))
34+
>x : Symbol(x, Decl(distributiveConditionalTypeConstraints.ts, 7, 33))
35+
36+
let f: false = x; // Error
37+
>f : Symbol(f, Decl(distributiveConditionalTypeConstraints.ts, 9, 7))
38+
>x : Symbol(x, Decl(distributiveConditionalTypeConstraints.ts, 7, 33))
39+
}
40+
41+
function f3<T extends string[]>(x: IsArray<T>) {
42+
>f3 : Symbol(f3, Decl(distributiveConditionalTypeConstraints.ts, 10, 1))
43+
>T : Symbol(T, Decl(distributiveConditionalTypeConstraints.ts, 12, 12))
44+
>x : Symbol(x, Decl(distributiveConditionalTypeConstraints.ts, 12, 32))
45+
>IsArray : Symbol(IsArray, Decl(distributiveConditionalTypeConstraints.ts, 0, 0))
46+
>T : Symbol(T, Decl(distributiveConditionalTypeConstraints.ts, 12, 12))
47+
48+
let t: true = x;
49+
>t : Symbol(t, Decl(distributiveConditionalTypeConstraints.ts, 13, 7))
50+
>x : Symbol(x, Decl(distributiveConditionalTypeConstraints.ts, 12, 32))
51+
52+
let f: false = x; // Error
53+
>f : Symbol(f, Decl(distributiveConditionalTypeConstraints.ts, 14, 7))
54+
>x : Symbol(x, Decl(distributiveConditionalTypeConstraints.ts, 12, 32))
55+
}
56+
57+
function f4<T extends Function>(x: IsArray<T>) {
58+
>f4 : Symbol(f4, Decl(distributiveConditionalTypeConstraints.ts, 15, 1))
59+
>T : Symbol(T, Decl(distributiveConditionalTypeConstraints.ts, 17, 12))
60+
>Function : Symbol(Function, Decl(lib.es5.d.ts, --, --), Decl(lib.es5.d.ts, --, --))
61+
>x : Symbol(x, Decl(distributiveConditionalTypeConstraints.ts, 17, 32))
62+
>IsArray : Symbol(IsArray, Decl(distributiveConditionalTypeConstraints.ts, 0, 0))
63+
>T : Symbol(T, Decl(distributiveConditionalTypeConstraints.ts, 17, 12))
64+
65+
let t: true = x; // Error
66+
>t : Symbol(t, Decl(distributiveConditionalTypeConstraints.ts, 18, 7))
67+
>x : Symbol(x, Decl(distributiveConditionalTypeConstraints.ts, 17, 32))
68+
69+
let f: false = x;
70+
>f : Symbol(f, Decl(distributiveConditionalTypeConstraints.ts, 19, 7))
71+
>x : Symbol(x, Decl(distributiveConditionalTypeConstraints.ts, 17, 32))
72+
}
73+
74+
type ZeroOf<T> =
75+
>ZeroOf : Symbol(ZeroOf, Decl(distributiveConditionalTypeConstraints.ts, 20, 1))
76+
>T : Symbol(T, Decl(distributiveConditionalTypeConstraints.ts, 22, 12))
77+
78+
T extends null ? null :
79+
>T : Symbol(T, Decl(distributiveConditionalTypeConstraints.ts, 22, 12))
80+
81+
T extends undefined ? undefined :
82+
>T : Symbol(T, Decl(distributiveConditionalTypeConstraints.ts, 22, 12))
83+
84+
T extends string ? "" :
85+
>T : Symbol(T, Decl(distributiveConditionalTypeConstraints.ts, 22, 12))
86+
87+
T extends number ? 0 :
88+
>T : Symbol(T, Decl(distributiveConditionalTypeConstraints.ts, 22, 12))
89+
90+
T extends boolean ? false :
91+
>T : Symbol(T, Decl(distributiveConditionalTypeConstraints.ts, 22, 12))
92+
93+
never;
94+
95+
function f10<T extends {}>(x: ZeroOf<T>) {
96+
>f10 : Symbol(f10, Decl(distributiveConditionalTypeConstraints.ts, 28, 10))
97+
>T : Symbol(T, Decl(distributiveConditionalTypeConstraints.ts, 30, 13))
98+
>x : Symbol(x, Decl(distributiveConditionalTypeConstraints.ts, 30, 27))
99+
>ZeroOf : Symbol(ZeroOf, Decl(distributiveConditionalTypeConstraints.ts, 20, 1))
100+
>T : Symbol(T, Decl(distributiveConditionalTypeConstraints.ts, 30, 13))
101+
102+
let t: "" | 0 | false = x;
103+
>t : Symbol(t, Decl(distributiveConditionalTypeConstraints.ts, 31, 7))
104+
>x : Symbol(x, Decl(distributiveConditionalTypeConstraints.ts, 30, 27))
105+
}
106+
107+
// Modified repro from #30152
108+
109+
interface A { foo(): void; }
110+
>A : Symbol(A, Decl(distributiveConditionalTypeConstraints.ts, 32, 1))
111+
>foo : Symbol(A.foo, Decl(distributiveConditionalTypeConstraints.ts, 36, 13))
112+
113+
interface B { bar(): void; }
114+
>B : Symbol(B, Decl(distributiveConditionalTypeConstraints.ts, 36, 28))
115+
>bar : Symbol(B.bar, Decl(distributiveConditionalTypeConstraints.ts, 37, 13))
116+
117+
interface C { foo(): void, bar(): void }
118+
>C : Symbol(C, Decl(distributiveConditionalTypeConstraints.ts, 37, 28))
119+
>foo : Symbol(C.foo, Decl(distributiveConditionalTypeConstraints.ts, 38, 13))
120+
>bar : Symbol(C.bar, Decl(distributiveConditionalTypeConstraints.ts, 38, 26))
121+
122+
function test1<T extends A>(y: T extends B ? number : string) {
123+
>test1 : Symbol(test1, Decl(distributiveConditionalTypeConstraints.ts, 38, 40))
124+
>T : Symbol(T, Decl(distributiveConditionalTypeConstraints.ts, 40, 15))
125+
>A : Symbol(A, Decl(distributiveConditionalTypeConstraints.ts, 32, 1))
126+
>y : Symbol(y, Decl(distributiveConditionalTypeConstraints.ts, 40, 28))
127+
>T : Symbol(T, Decl(distributiveConditionalTypeConstraints.ts, 40, 15))
128+
>B : Symbol(B, Decl(distributiveConditionalTypeConstraints.ts, 36, 28))
129+
130+
if (typeof y == 'string') {
131+
>y : Symbol(y, Decl(distributiveConditionalTypeConstraints.ts, 40, 28))
132+
133+
y; // T extends B ? number : string
134+
>y : Symbol(y, Decl(distributiveConditionalTypeConstraints.ts, 40, 28))
135+
}
136+
else {
137+
y; // never
138+
>y : Symbol(y, Decl(distributiveConditionalTypeConstraints.ts, 40, 28))
139+
}
140+
const newY: string | number = y;
141+
>newY : Symbol(newY, Decl(distributiveConditionalTypeConstraints.ts, 47, 9))
142+
>y : Symbol(y, Decl(distributiveConditionalTypeConstraints.ts, 40, 28))
143+
144+
newY; // string
145+
>newY : Symbol(newY, Decl(distributiveConditionalTypeConstraints.ts, 47, 9))
146+
}
147+
148+
function test2<T extends A>(y: T extends B ? string : number) {
149+
>test2 : Symbol(test2, Decl(distributiveConditionalTypeConstraints.ts, 49, 1))
150+
>T : Symbol(T, Decl(distributiveConditionalTypeConstraints.ts, 51, 15))
151+
>A : Symbol(A, Decl(distributiveConditionalTypeConstraints.ts, 32, 1))
152+
>y : Symbol(y, Decl(distributiveConditionalTypeConstraints.ts, 51, 28))
153+
>T : Symbol(T, Decl(distributiveConditionalTypeConstraints.ts, 51, 15))
154+
>B : Symbol(B, Decl(distributiveConditionalTypeConstraints.ts, 36, 28))
155+
156+
if (typeof y == 'string') {
157+
>y : Symbol(y, Decl(distributiveConditionalTypeConstraints.ts, 51, 28))
158+
159+
y; // never
160+
>y : Symbol(y, Decl(distributiveConditionalTypeConstraints.ts, 51, 28))
161+
}
162+
else {
163+
y; // T extends B ? string : number
164+
>y : Symbol(y, Decl(distributiveConditionalTypeConstraints.ts, 51, 28))
165+
}
166+
const newY: string | number = y;
167+
>newY : Symbol(newY, Decl(distributiveConditionalTypeConstraints.ts, 58, 9))
168+
>y : Symbol(y, Decl(distributiveConditionalTypeConstraints.ts, 51, 28))
169+
170+
newY; // number
171+
>newY : Symbol(newY, Decl(distributiveConditionalTypeConstraints.ts, 58, 9))
172+
}
173+
174+
function test3<T extends A>(y: T extends C ? number : string) {
175+
>test3 : Symbol(test3, Decl(distributiveConditionalTypeConstraints.ts, 60, 1))
176+
>T : Symbol(T, Decl(distributiveConditionalTypeConstraints.ts, 62, 15))
177+
>A : Symbol(A, Decl(distributiveConditionalTypeConstraints.ts, 32, 1))
178+
>y : Symbol(y, Decl(distributiveConditionalTypeConstraints.ts, 62, 28))
179+
>T : Symbol(T, Decl(distributiveConditionalTypeConstraints.ts, 62, 15))
180+
>C : Symbol(C, Decl(distributiveConditionalTypeConstraints.ts, 37, 28))
181+
182+
if (typeof y == 'string') {
183+
>y : Symbol(y, Decl(distributiveConditionalTypeConstraints.ts, 62, 28))
184+
185+
y; // (T extends C ? number : string) & string
186+
>y : Symbol(y, Decl(distributiveConditionalTypeConstraints.ts, 62, 28))
187+
}
188+
else {
189+
y; // T extends C ? number : string
190+
>y : Symbol(y, Decl(distributiveConditionalTypeConstraints.ts, 62, 28))
191+
}
192+
const newY: string | number = y;
193+
>newY : Symbol(newY, Decl(distributiveConditionalTypeConstraints.ts, 69, 9))
194+
>y : Symbol(y, Decl(distributiveConditionalTypeConstraints.ts, 62, 28))
195+
196+
newY; // string | number
197+
>newY : Symbol(newY, Decl(distributiveConditionalTypeConstraints.ts, 69, 9))
198+
}
199+
200+
function test4<T extends A>(y: T extends C ? string : number) {
201+
>test4 : Symbol(test4, Decl(distributiveConditionalTypeConstraints.ts, 71, 1))
202+
>T : Symbol(T, Decl(distributiveConditionalTypeConstraints.ts, 73, 15))
203+
>A : Symbol(A, Decl(distributiveConditionalTypeConstraints.ts, 32, 1))
204+
>y : Symbol(y, Decl(distributiveConditionalTypeConstraints.ts, 73, 28))
205+
>T : Symbol(T, Decl(distributiveConditionalTypeConstraints.ts, 73, 15))
206+
>C : Symbol(C, Decl(distributiveConditionalTypeConstraints.ts, 37, 28))
207+
208+
if (typeof y == 'string') {
209+
>y : Symbol(y, Decl(distributiveConditionalTypeConstraints.ts, 73, 28))
210+
211+
y; // (T extends C ? string : number) & string
212+
>y : Symbol(y, Decl(distributiveConditionalTypeConstraints.ts, 73, 28))
213+
}
214+
else {
215+
y; // T extends C ? string : number
216+
>y : Symbol(y, Decl(distributiveConditionalTypeConstraints.ts, 73, 28))
217+
}
218+
const newY: string | number = y;
219+
>newY : Symbol(newY, Decl(distributiveConditionalTypeConstraints.ts, 80, 9))
220+
>y : Symbol(y, Decl(distributiveConditionalTypeConstraints.ts, 73, 28))
221+
222+
newY; // string | number
223+
>newY : Symbol(newY, Decl(distributiveConditionalTypeConstraints.ts, 80, 9))
224+
}
225+

0 commit comments

Comments
 (0)