• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1/*
2* Copyright (c) Microsoft Corporation. All rights reserved.
3* Copyright (c) 2023 Huawei Device Co., Ltd.
4* Licensed under the Apache License, Version 2.0 (the "License");
5* you may not use this file except in compliance with the License.
6* You may obtain a copy of the License at
7*
8*     http://www.apache.org/licenses/LICENSE-2.0
9*
10* Unless required by applicable law or agreed to in writing, software
11* distributed under the License is distributed on an "AS IS" BASIS,
12* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13* See the License for the specific language governing permissions and
14* limitations under the License.
15*
16* This file has been modified by Huawei to verify type inference by adding verification statements.
17*/
18
19// === tests/cases/conformance/types/typeRelationships/subtypesAndSuperTypes/nullIsSubtypeOfEverythingButUndefined.ts ===
20declare function AssertType(value:any, type:string):void;
21// null is a subtype of any other types except undefined
22
23let r0 = true ? null : null;
24AssertType(r0, "any");
25AssertType(true ? null : null, "null");
26AssertType(true, "boolean");
27AssertType(null, "null");
28AssertType(null, "null");
29
30let r0 = true ? null : null;
31AssertType(r0, "any");
32AssertType(true ? null : null, "null");
33AssertType(true, "boolean");
34AssertType(null, "null");
35AssertType(null, "null");
36
37let u: typeof undefined;
38AssertType(u, "any");
39AssertType(undefined, "undefined");
40
41let r0b = true ? u : null;
42AssertType(r0b, "any");
43AssertType(true ? u : null, "any");
44AssertType(true, "boolean");
45AssertType(u, "any");
46AssertType(null, "null");
47
48let r0b = true ? null : u;
49AssertType(r0b, "any");
50AssertType(true ? null : u, "any");
51AssertType(true, "boolean");
52AssertType(null, "null");
53AssertType(u, "any");
54
55let r1 = true ? 1 : null;
56AssertType(r1, "number");
57AssertType(true ? 1 : null, "int");
58AssertType(true, "boolean");
59AssertType(1, "int");
60AssertType(null, "null");
61
62let r1 = true ? null : 1;
63AssertType(r1, "number");
64AssertType(true ? null : 1, "int");
65AssertType(true, "boolean");
66AssertType(null, "null");
67AssertType(1, "int");
68
69let r2 = true ? '' : null;
70AssertType(r2, "string");
71AssertType(true ? '' : null, "string");
72AssertType(true, "boolean");
73AssertType('', "string");
74AssertType(null, "null");
75
76let r2 = true ? null : '';
77AssertType(r2, "string");
78AssertType(true ? null : '', "string");
79AssertType(true, "boolean");
80AssertType(null, "null");
81AssertType('', "string");
82
83let r3 = true ? true : null;
84AssertType(r3, "boolean");
85AssertType(true ? true : null, "boolean");
86AssertType(true, "boolean");
87AssertType(true, "boolean");
88AssertType(null, "null");
89
90let r3 = true ? null : true;
91AssertType(r3, "boolean");
92AssertType(true ? null : true, "boolean");
93AssertType(true, "boolean");
94AssertType(null, "null");
95AssertType(true, "boolean");
96
97let r4 = true ? new Date() : null;
98AssertType(r4, "Date");
99AssertType(true ? new Date() : null, "Date");
100AssertType(true, "boolean");
101AssertType(new Date(), "Date");
102AssertType(Date, "DateConstructor");
103AssertType(null, "null");
104
105let r4 = true ? null : new Date();
106AssertType(r4, "Date");
107AssertType(true ? null : new Date(), "Date");
108AssertType(true, "boolean");
109AssertType(null, "null");
110AssertType(new Date(), "Date");
111AssertType(Date, "DateConstructor");
112
113let r5 = true ? /1/ : null;
114AssertType(r5, "RegExp");
115AssertType(true ? /1/ : null, "RegExp");
116AssertType(true, "boolean");
117AssertType(/1/, "RegExp");
118AssertType(null, "null");
119
120let r5 = true ? null : /1/;
121AssertType(r5, "RegExp");
122AssertType(true ? null : /1/, "RegExp");
123AssertType(true, "boolean");
124AssertType(null, "null");
125AssertType(/1/, "RegExp");
126
127let r6 = true ? { foo: 1 } : null;
128AssertType(r6, "{ foo: number; }");
129AssertType(true ? { foo: 1 } : null, "{ foo: number; }");
130AssertType(true, "boolean");
131AssertType({ foo: 1 }, "{ foo: number; }");
132AssertType(foo, "number");
133AssertType(1, "int");
134AssertType(null, "null");
135
136let r6 = true ? null : { foo: 1 };
137AssertType(r6, "{ foo: number; }");
138AssertType(true ? null : { foo: 1 }, "{ foo: number; }");
139AssertType(true, "boolean");
140AssertType(null, "null");
141AssertType({ foo: 1 }, "{ foo: number; }");
142AssertType(foo, "number");
143AssertType(1, "int");
144
145let r7 = true ? () => { } : null;
146AssertType(r7, "() => void");
147AssertType(true ? () => { } : null, "() => void");
148AssertType(true, "boolean");
149AssertType(() => { }, "() => void");
150AssertType(null, "null");
151
152let r7 = true ? null : () => { };
153AssertType(r7, "() => void");
154AssertType(true ? null : () => { }, "() => void");
155AssertType(true, "boolean");
156AssertType(null, "null");
157AssertType(() => { }, "() => void");
158
159let r8 = true ? <T>(x: T) => {
160AssertType(r8, "<T>(T) => T");
161AssertType(true ? <T>(x: T) => { return x } : null, "<T>(T) => T");
162AssertType(true, "boolean");
163AssertType(<T>(x: T) => { return x }, "<T>(T) => T");
164AssertType(x, "T");
165AssertType(x, "T");
166AssertType(null, "null");
167return x } : null;
168
169let r8b = true ? null : <T>(x: T) => {
170AssertType(r8b, "<T>(T) => T");
171AssertType(true ? null : <T>(x: T) => { return x }, "<T>(T) => T");
172AssertType(true, "boolean");
173AssertType(null, "null");
174AssertType(<T>(x: T) => { return x }, "<T>(T) => T");
175AssertType(x, "T");
176AssertType(x, "T");
177return x }; // type parameters not identical across declarations
178
179interface I1 { foo: number; }
180let i1: I1;
181AssertType(i1, "I1");
182
183let r9 = true ? i1 : null;
184AssertType(r9, "I1");
185AssertType(true ? i1 : null, "I1");
186AssertType(true, "boolean");
187AssertType(i1, "I1");
188AssertType(null, "null");
189
190let r9 = true ? null : i1;
191AssertType(r9, "I1");
192AssertType(true ? null : i1, "I1");
193AssertType(true, "boolean");
194AssertType(null, "null");
195AssertType(i1, "I1");
196
197class C1 { foo: number; }
198let c1: C1;
199AssertType(c1, "C1");
200
201let r10 = true ? c1 : null;
202AssertType(r10, "C1");
203AssertType(true ? c1 : null, "C1");
204AssertType(true, "boolean");
205AssertType(c1, "C1");
206AssertType(null, "null");
207
208let r10 = true ? null : c1;
209AssertType(r10, "C1");
210AssertType(true ? null : c1, "C1");
211AssertType(true, "boolean");
212AssertType(null, "null");
213AssertType(c1, "C1");
214
215class C2<T> { foo: T; }
216let c2: C2<number>;
217AssertType(c2, "C2<number>");
218
219let r12 = true ? c2 : null;
220AssertType(r12, "C2<number>");
221AssertType(true ? c2 : null, "C2<number>");
222AssertType(true, "boolean");
223AssertType(c2, "C2<number>");
224AssertType(null, "null");
225
226let r12 = true ? null : c2;
227AssertType(r12, "C2<number>");
228AssertType(true ? null : c2, "C2<number>");
229AssertType(true, "boolean");
230AssertType(null, "null");
231AssertType(c2, "C2<number>");
232
233enum E { A }
234let r13 = true ? E : null;
235AssertType(r13, "typeof E");
236AssertType(true ? E : null, "typeof E");
237AssertType(true, "boolean");
238AssertType(E, "typeof E");
239AssertType(null, "null");
240
241let r13 = true ? null : E;
242AssertType(r13, "typeof E");
243AssertType(true ? null : E, "typeof E");
244AssertType(true, "boolean");
245AssertType(null, "null");
246AssertType(E, "typeof E");
247
248let r14 = true ? E.A : null;
249AssertType(r14, "E");
250AssertType(true ? E.A : null, "E");
251AssertType(true, "boolean");
252AssertType(E.A, "E");
253AssertType(null, "null");
254
255let r14 = true ? null : E.A;
256AssertType(r14, "E");
257AssertType(true ? null : E.A, "E");
258AssertType(true, "boolean");
259AssertType(null, "null");
260AssertType(E.A, "E");
261
262function f() { }
263module f {
264    export let bar = 1;
265}
266let af: typeof f;
267AssertType(af, "typeof f");
268AssertType(f, "typeof f");
269
270let r15 = true ? af : null;
271AssertType(r15, "typeof f");
272AssertType(true ? af : null, "typeof f");
273AssertType(true, "boolean");
274AssertType(af, "typeof f");
275AssertType(null, "null");
276
277let r15 = true ? null : af;
278AssertType(r15, "typeof f");
279AssertType(true ? null : af, "typeof f");
280AssertType(true, "boolean");
281AssertType(null, "null");
282AssertType(af, "typeof f");
283
284class c { baz: string }
285module c {
286    export let bar = 1;
287}
288let ac: typeof c;
289AssertType(ac, "typeof c");
290AssertType(c, "typeof c");
291
292let r16 = true ? ac : null;
293AssertType(r16, "typeof c");
294AssertType(true ? ac : null, "typeof c");
295AssertType(true, "boolean");
296AssertType(ac, "typeof c");
297AssertType(null, "null");
298
299let r16 = true ? null : ac;
300AssertType(r16, "typeof c");
301AssertType(true ? null : ac, "typeof c");
302AssertType(true, "boolean");
303AssertType(null, "null");
304AssertType(ac, "typeof c");
305
306function f17<T>(x: T) {
307    let r17 = true ? x : null;
308AssertType(r17, "T");
309AssertType(true ? x : null, "T");
310AssertType(true, "boolean");
311AssertType(x, "T");
312AssertType(null, "null");
313
314    let r17 = true ? null : x;
315AssertType(r17, "T");
316AssertType(true ? null : x, "T");
317AssertType(true, "boolean");
318AssertType(null, "null");
319AssertType(x, "T");
320}
321
322function f18<T, U>(x: U) {
323    let r18 = true ? x : null;
324AssertType(r18, "U");
325AssertType(true ? x : null, "U");
326AssertType(true, "boolean");
327AssertType(x, "U");
328AssertType(null, "null");
329
330    let r18 = true ? null : x;
331AssertType(r18, "U");
332AssertType(true ? null : x, "U");
333AssertType(true, "boolean");
334AssertType(null, "null");
335AssertType(x, "U");
336}
337
338let r19 = true ? new Object() : null;
339AssertType(r19, "Object");
340AssertType(true ? new Object() : null, "Object");
341AssertType(true, "boolean");
342AssertType(new Object(), "Object");
343AssertType(Object, "ObjectConstructor");
344AssertType(null, "null");
345
346let r19 = true ? null : new Object();
347AssertType(r19, "Object");
348AssertType(true ? null : new Object(), "Object");
349AssertType(true, "boolean");
350AssertType(null, "null");
351AssertType(new Object(), "Object");
352AssertType(Object, "ObjectConstructor");
353
354let r20 = true ? {} : null;
355AssertType(r20, "{}");
356AssertType(true ? {} : null, "{}");
357AssertType(true, "boolean");
358AssertType({}, "{}");
359AssertType(null, "null");
360
361let r20 = true ? null : {};
362AssertType(r20, "{}");
363AssertType(true ? null : {}, "{}");
364AssertType(true, "boolean");
365AssertType(null, "null");
366AssertType({}, "{}");
367
368
369