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/bestCommonType/bestCommonTypeOfConditionalExpressions.ts === 20declare function AssertType(value:any, type:string):void; 21// conditional expressions return the best common type of the branches plus contextual type (using the first candidate if multiple BCTs exist) 22// no errors expected here 23 24let a: { x: number; y?: number }; 25AssertType(a, "{ x: number; y?: number; }"); 26AssertType(x, "number"); 27AssertType(y, "number"); 28 29let b: { x: number; z?: number }; 30AssertType(b, "{ x: number; z?: number; }"); 31AssertType(x, "number"); 32AssertType(z, "number"); 33 34class Base { foo: string; } 35class Derived extends Base { bar: string; } 36class Derived2 extends Base { baz: string; } 37let base: Base; 38AssertType(base, "Base"); 39 40let derived: Derived; 41AssertType(derived, "Derived"); 42 43let derived2: Derived2; 44AssertType(derived2, "Derived2"); 45 46let r = true ? 1 : 2; 47AssertType(r, "number"); 48AssertType(true ? 1 : 2, "union"); 49AssertType(true, "boolean"); 50AssertType(1, "int"); 51AssertType(2, "int"); 52 53let r3 = true ? 1 : {}; 54AssertType(r3, "{}"); 55AssertType(true ? 1 : {}, "union"); 56AssertType(true, "boolean"); 57AssertType(1, "int"); 58AssertType({}, "{}"); 59 60let r4 = true ? a : b; // typeof a 61AssertType(r4, "union"); 62AssertType(true ? a : b, "union"); 63AssertType(true, "boolean"); 64AssertType(a, "{ x: number; y?: number; }"); 65AssertType(b, "{ x: number; z?: number; }"); 66 67let r5 = true ? b : a; // typeof b 68AssertType(r5, "union"); 69AssertType(true ? b : a, "union"); 70AssertType(true, "boolean"); 71AssertType(b, "{ x: number; z?: number; }"); 72AssertType(a, "{ x: number; y?: number; }"); 73 74let r6 = true ? (x: number) => { } : (x: Object) => { }; // 75AssertType(r6, "union"); 76AssertType(true ? (x: number) => { } : (x: Object) => { }, "union"); 77AssertType(true, "boolean"); 78AssertType((x: number) => { }, "(number) => void"); 79AssertType(x, "number"); 80AssertType((x: Object) => { }, "(Object) => void"); 81AssertType(x, "Object"); 82returns number => void 83 84let r7: (x: Object) => void = true ? (x: number) => { } : (x: Object) => { }; 85AssertType(r7, "(Object) => void"); 86AssertType(x, "Object"); 87AssertType(true ? (x: number) => { } : (x: Object) => { }, "union"); 88AssertType(true, "boolean"); 89AssertType((x: number) => { }, "(number) => void"); 90AssertType(x, "number"); 91AssertType((x: Object) => { }, "(Object) => void"); 92AssertType(x, "Object"); 93 94let r8 = true ? (x: Object) => { } : (x: number) => { }; // 95AssertType(r8, "union"); 96AssertType(true ? (x: Object) => { } : (x: number) => { }, "union"); 97AssertType(true, "boolean"); 98AssertType((x: Object) => { }, "(Object) => void"); 99AssertType(x, "Object"); 100AssertType((x: number) => { }, "(number) => void"); 101AssertType(x, "number"); 102returns Object => void 103 104let r10: Base = true ? derived : derived2; // no error since we use the contextual type in BCT 105AssertType(r10, "Base"); 106AssertType(true ? derived : derived2, "union"); 107AssertType(true, "boolean"); 108AssertType(derived, "Derived"); 109AssertType(derived2, "Derived2"); 110 111let r11 = true ? base : derived2; 112AssertType(r11, "Base"); 113AssertType(true ? base : derived2, "Base"); 114AssertType(true, "boolean"); 115AssertType(base, "Base"); 116AssertType(derived2, "Derived2"); 117 118function foo5<T, U>(t: T, u: U): Object { 119AssertType(true ? t : u, "union"); 120AssertType(true, "boolean"); 121AssertType(t, "T"); 122AssertType(u, "U"); 123 return true ? t : u; // BCT is Object 124} 125 126