1/* 2 * Copyright (c) 2021-2025 Huawei Device Co., Ltd. 3 * Licensed under the Apache License, Version 2.0 (the "License"); 4 * you may not use this file except in compliance with the License. 5 * You may obtain a copy of the License at 6 * 7 * http://www.apache.org/licenses/LICENSE-2.0 8 * 9 * Unless required by applicable law or agreed to in writing, software 10 * distributed under the License is distributed on an "AS IS" BASIS, 11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 * See the License for the specific language governing permissions and 13 * limitations under the License. 14 */ 15 16class A<T extends Object> { 17 union0: T; 18 constructor(union0: T) { 19 this.union0 = union0 20 } 21} 22class B { 23 num: int = 42 24} 25class C { 26 num: int = 43 27} 28 29function foo(x: B|C) { 30 if (x instanceof B) { 31 assertEQ(x.num, 42, "Error! num field must be 42"); 32 } else if (x instanceof C) { 33 assertEQ(x.num, 43, "Error! num field must be 43"); 34 } else { 35 assertTrue(false, "Error! x must be instanceof B|C"); 36 } 37} 38 39function bar(x: A<B|C>) { 40 if (x.union0 instanceof B) { 41 assertEQ(x.union0.num, 42, "Error! x.union0.num field must be 42"); 42 } else if (x.union0 instanceof C) { 43 assertEQ(x.union0.num, 43, "Error! x.union0.num field must be 43"); 44 } else { 45 assertTrue(false, "Error! x.union0 must be instanceof B|C"); 46 } 47} 48 49function main(): void { 50 let a: A<B|C> = new A<B|C>(new B()); 51 foo(a.union0); 52 bar(a); 53 a.union0 = new C(); 54 bar(a); 55 foo(a.union0); 56} 57 58