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/compiler/bestCommonTypeWithContextualTyping.ts === 20declare function AssertType(value:any, type:string):void; 21interface Contextual { 22 dummy; 23 p?: number; 24} 25 26interface Ellement { 27 dummy; 28 p: any; 29} 30 31let e: Ellement; 32AssertType(e, "Ellement"); 33 34// All of these should pass. Neither type is a supertype of the other, but the RHS should 35// always use Ellement in these examples (not Contextual). Because Ellement is assignable 36// to Contextual, no errors. 37let arr: Contextual[] = [e]; // Ellement[] 38AssertType(arr, "Contextual[]"); 39AssertType([e], "Ellement[]"); 40AssertType(e, "Ellement"); 41 42let obj: { [s: string]: Contextual } = { s: e }; // { s: Ellement; [s: string]: Ellement 43AssertType(obj, "{ [string]: Contextual; }"); 44 45AssertType(s, "string"); 46 47AssertType({ s: e }, "{ s: Ellement; }"); 48 49AssertType(s, "Ellement"); 50 51AssertType(e, "Ellement"); 52} 53 54let conditional: Contextual = null ? e : e; // Ellement 55AssertType(conditional, "Contextual"); 56AssertType(null ? e : e, "Ellement"); 57AssertType(null, "null"); 58AssertType(e, "Ellement"); 59AssertType(e, "Ellement"); 60 61let contextualOr: Contextual = e || e; // Ellement 62AssertType(contextualOr, "Contextual"); 63AssertType(e || e, "Ellement"); 64AssertType(e, "Ellement"); 65AssertType(e, "Ellement"); 66 67 68