@@ -55,6 +55,113 @@ declare function foo3<T extends string>(x: Uppercase<T>): T;
5555function foo4<U extends string>(x: Uppercase<U>) {
5656 return foo3(x);
5757}
58+
59+ type TI1 = Integer<3.5>; // 3
60+ type TI2 = Integer<2.5 | 3.4>; // 2 | 3
61+ type TI3 = Integer<number>; // number
62+ type TI4 = Integer<any>; // any
63+ type TI5 = Integer<never>; // never
64+ type TI6 = Integer<'42'>; // Error
65+
66+ type TA1 = Add<4, 2>; // 6
67+ type TA2L = Add<4 | 5, 2>; // 6 | 7
68+ type TA2R = Add<4, 2 | 3>; // 6 | 7
69+ type TA2LR = Add<4 | 5, 2 | 3>; // 6 | 7 | 8
70+ type TA3L = Add<number, 2>; // number
71+ type TA3R = Add<4, number>; // number
72+ type TA3LR = Add<number, number>; // number
73+ type TA4L = Add<any, 2>; // any
74+ type TA4R = Add<4, any>; // any
75+ type TA4LR = Add<any, any>; // any
76+ type TA5L = Add<never, 2>; // never
77+ type TA5R = Add<4, never>; // never
78+ type TA5LR = Add<never, never>; // never
79+ type TA6L = Add<'4', 2>; // Error
80+ type TA6R = Add<4, '2'>; // Error
81+ type TA6LR = Add<'4', '2'>; // Error
82+
83+ type TS1 = Subtract<4, 2>; // 2
84+ type TS2L = Subtract<4 | 5, 2>; // 2 | 3
85+ type TS2R = Subtract<4, 2 | 3>; // 2 | 1
86+ type TS2LR = Subtract<4 | 5, 2 | 3>; // 2 | 1 | 3
87+ type TS3L = Subtract<number, 2>; // number
88+ type TS3R = Subtract<4, number>; // number
89+ type TS3LR = Subtract<number, number>; // number
90+ type TS4L = Subtract<any, 2>; // any
91+ type TS4R = Subtract<4, any>; // any
92+ type TS4LR = Subtract<any, any>; // any
93+ type TS5L = Subtract<never, 2>; // never
94+ type TS5R = Subtract<4, never>; // never
95+ type TS5LR = Subtract<never, never>; // never
96+ type TS6L = Subtract<'4', 2>; // Error
97+ type TS6R = Subtract<4, '2'>; // Error
98+ type TS6LR = Subtract<'4', '2'>; // Error
99+
100+ type TM1 = Multiply<4, 2>; // 8
101+ type TM2L = Multiply<4 | 5, 2>; // 8 | 10
102+ type TM2R = Multiply<4, 2 | 3>; // 8 | 12
103+ type TM2LR = Multiply<4 | 5, 2 | 3>; // 8 | 12 | 10 | 15
104+ type TM3L = Multiply<number, 2>; // number
105+ type TM3R = Multiply<4, number>; // number
106+ type TM3LR = Multiply<number, number>; // number
107+ type TM4L = Multiply<any, 2>; // any
108+ type TM4R = Multiply<4, any>; // any
109+ type TM4LR = Multiply<any, any>; // any
110+ type TM5L = Multiply<never, 2>; // never
111+ type TM5R = Multiply<4, never>; // never
112+ type TM5LR = Multiply<never, never>; // never
113+ type TM6L = Multiply<'4', 2>; // Error
114+ type TM6R = Multiply<4, '2'>; // Error
115+ type TM6LR = Multiply<'4', '2'>; // Error
116+
117+ type TD1 = Divide<4, 2>; // 2
118+ type TD2L = Divide<4 | 5, 2>; // 2 | 2.5
119+ type TD2R = Divide<4, 2 | 4>; // 2 | 1
120+ type TD2LR = Divide<4 | 5, 2 | 4>; // 2 | 1 | 2.5 | 1.25
121+ type TD3L = Divide<number, 2>; // number
122+ type TD3R = Divide<4, number>; // number
123+ type TD3LR = Divide<number, number>; // number
124+ type TD4L = Divide<any, 2>; // any
125+ type TD4R = Divide<4, any>; // any
126+ type TD4LR = Divide<any, any>; // any
127+ type TD5L = Divide<never, 2>; // never
128+ type TD5R = Divide<4, never>; // never
129+ type TD5LR = Divide<never, never>; // never
130+ type TD6L = Divide<'4', 2>; // Error
131+ type TD6R = Divide<4, '2'>; // Error
132+ type TD6LR = Divide<'4', '2'>; // Error
133+ type TD7 = Divide<1, 0>; // never
134+
135+ type TIX1<S extends number> = Integer<S>;
136+ type TIX2 = TIX1<4.2>; // 4
137+ type TAX1<M extends number, N extends number> = Add<M, N>;
138+ type TAX2 = TAX1<4, 2>; // 6
139+ type TSX1<M extends number, N extends number> = Subtract<M, N>;
140+ type TSX2 = TSX1<4, 2>; // 6
141+ type TMX1<M extends number, N extends number> = Multiply<M, N>;
142+ type TMX2 = TMX1<4, 2>; // 8
143+ type TDX1<M extends number, N extends number> = Divide<M, N>;
144+ type TDX2 = TDX1<4, 2>; // 2
145+ type TAMX = Add<2, Multiply<5, 8>> // 42
146+
147+ function foo5<T extends number, U extends T>(s: number, x: Add<T, U>, y: Multiply<T, U>) {
148+ s = x;
149+ s = y;
150+ x = s; // Error
151+ x = y; // Error
152+ y = s; // Error
153+ y = x; // Error
154+ }
155+
156+ function foo6<T extends 0 | 1>(x: Add<T, 3>) {
157+ let s: 3 | 4 = x;
158+ }
159+
160+ declare function foo7<T extends number>(x: Integer<T>): T;
161+
162+ function foo8<U extends number>(x: Integer<U>) {
163+ return foo7(x);
164+ }
58165
59166
60167//// [intrinsicTypes.js]
@@ -73,6 +180,20 @@ function foo2(x) {
73180function foo4(x) {
74181 return foo3(x);
75182}
183+ function foo5(s, x, y) {
184+ s = x;
185+ s = y;
186+ x = s; // Error
187+ x = y; // Error
188+ y = s; // Error
189+ y = x; // Error
190+ }
191+ function foo6(x) {
192+ var s = x;
193+ }
194+ function foo8(x) {
195+ return foo7(x);
196+ }
76197
77198
78199//// [intrinsicTypes.d.ts]
@@ -110,3 +231,89 @@ declare function foo1<T extends string, U extends T>(s: string, x: Uppercase<T>,
110231declare function foo2 < T extends 'foo' | 'bar' > ( x : Uppercase < T > ) : void ;
111232declare function foo3 < T extends string > ( x : Uppercase < T > ) : T ;
112233declare function foo4 < U extends string > ( x : Uppercase < U > ) : U ;
234+ declare type TI1 = Integer < 3.5 > ;
235+ declare type TI2 = Integer < 2.5 | 3.4 > ;
236+ declare type TI3 = Integer < number > ;
237+ declare type TI4 = Integer < any > ;
238+ declare type TI5 = Integer < never > ;
239+ declare type TI6 = Integer < '42' > ;
240+ declare type TA1 = Add < 4 , 2 > ;
241+ declare type TA2L = Add < 4 | 5 , 2 > ;
242+ declare type TA2R = Add < 4 , 2 | 3 > ;
243+ declare type TA2LR = Add < 4 | 5 , 2 | 3 > ;
244+ declare type TA3L = Add < number , 2 > ;
245+ declare type TA3R = Add < 4 , number > ;
246+ declare type TA3LR = Add < number , number > ;
247+ declare type TA4L = Add < any , 2 > ;
248+ declare type TA4R = Add < 4 , any > ;
249+ declare type TA4LR = Add < any , any > ;
250+ declare type TA5L = Add < never , 2 > ;
251+ declare type TA5R = Add < 4 , never > ;
252+ declare type TA5LR = Add < never , never > ;
253+ declare type TA6L = Add < '4' , 2 > ;
254+ declare type TA6R = Add < 4 , '2' > ;
255+ declare type TA6LR = Add < '4' , '2' > ;
256+ declare type TS1 = Subtract < 4 , 2 > ;
257+ declare type TS2L = Subtract < 4 | 5 , 2 > ;
258+ declare type TS2R = Subtract < 4 , 2 | 3 > ;
259+ declare type TS2LR = Subtract < 4 | 5 , 2 | 3 > ;
260+ declare type TS3L = Subtract < number , 2 > ;
261+ declare type TS3R = Subtract < 4 , number > ;
262+ declare type TS3LR = Subtract < number , number > ;
263+ declare type TS4L = Subtract < any , 2 > ;
264+ declare type TS4R = Subtract < 4 , any > ;
265+ declare type TS4LR = Subtract < any , any > ;
266+ declare type TS5L = Subtract < never , 2 > ;
267+ declare type TS5R = Subtract < 4 , never > ;
268+ declare type TS5LR = Subtract < never , never > ;
269+ declare type TS6L = Subtract < '4' , 2 > ;
270+ declare type TS6R = Subtract < 4 , '2' > ;
271+ declare type TS6LR = Subtract < '4' , '2' > ;
272+ declare type TM1 = Multiply < 4 , 2 > ;
273+ declare type TM2L = Multiply < 4 | 5 , 2 > ;
274+ declare type TM2R = Multiply < 4 , 2 | 3 > ;
275+ declare type TM2LR = Multiply < 4 | 5 , 2 | 3 > ;
276+ declare type TM3L = Multiply < number , 2 > ;
277+ declare type TM3R = Multiply < 4 , number > ;
278+ declare type TM3LR = Multiply < number , number > ;
279+ declare type TM4L = Multiply < any , 2 > ;
280+ declare type TM4R = Multiply < 4 , any > ;
281+ declare type TM4LR = Multiply < any , any > ;
282+ declare type TM5L = Multiply < never , 2 > ;
283+ declare type TM5R = Multiply < 4 , never > ;
284+ declare type TM5LR = Multiply < never , never > ;
285+ declare type TM6L = Multiply < '4' , 2 > ;
286+ declare type TM6R = Multiply < 4 , '2' > ;
287+ declare type TM6LR = Multiply < '4' , '2' > ;
288+ declare type TD1 = Divide < 4 , 2 > ;
289+ declare type TD2L = Divide < 4 | 5 , 2 > ;
290+ declare type TD2R = Divide < 4 , 2 | 4 > ;
291+ declare type TD2LR = Divide < 4 | 5 , 2 | 4 > ;
292+ declare type TD3L = Divide < number , 2 > ;
293+ declare type TD3R = Divide < 4 , number > ;
294+ declare type TD3LR = Divide < number , number > ;
295+ declare type TD4L = Divide < any , 2 > ;
296+ declare type TD4R = Divide < 4 , any > ;
297+ declare type TD4LR = Divide < any , any > ;
298+ declare type TD5L = Divide < never , 2 > ;
299+ declare type TD5R = Divide < 4 , never > ;
300+ declare type TD5LR = Divide < never , never > ;
301+ declare type TD6L = Divide < '4' , 2 > ;
302+ declare type TD6R = Divide < 4 , '2' > ;
303+ declare type TD6LR = Divide < '4' , '2' > ;
304+ declare type TD7 = Divide < 1 , 0 > ;
305+ declare type TIX1 < S extends number > = Integer < S > ;
306+ declare type TIX2 = TIX1 < 4.2 > ;
307+ declare type TAX1 < M extends number , N extends number > = Add < M , N > ;
308+ declare type TAX2 = TAX1 < 4 , 2 > ;
309+ declare type TSX1 < M extends number , N extends number > = Subtract < M , N > ;
310+ declare type TSX2 = TSX1 < 4 , 2 > ;
311+ declare type TMX1 < M extends number , N extends number > = Multiply < M , N > ;
312+ declare type TMX2 = TMX1 < 4 , 2 > ;
313+ declare type TDX1 < M extends number , N extends number > = Divide < M , N > ;
314+ declare type TDX2 = TDX1 < 4 , 2 > ;
315+ declare type TAMX = Add < 2 , Multiply < 5 , 8 >> ;
316+ declare function foo5 < T extends number , U extends T > ( s : number , x : Add < T , U > , y : Multiply < T , U > ) : void ;
317+ declare function foo6 < T extends 0 | 1 > ( x : Add < T , 3 > ) : void ;
318+ declare function foo7 < T extends number > ( x : Integer < T > ) : T ;
319+ declare function foo8 < U extends number > ( x : Integer < U > ) : U ;
0 commit comments