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