1/* 2 * Copyright (c) 2021-2024 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 assert x.num == 42: "Error! num field must be 42"; 32 } else if (x instanceof C) { 33 assert x.num == 43: "Error! num field must be 43"; 34 } else { 35 assert false: "Error! x must be instanceof B|C"; 36 } 37} 38 39function bar(x: A<B|C>) { 40 if (x.union0 instanceof B) { 41 assert x.union0.num == 42: "Error! x.union0.num field must be 42"; 42 } else if (x.union0 instanceof C) { 43 assert x.union0.num == 43: "Error! x.union0.num field must be 43"; 44 } else { 45 assert 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