• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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