• 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/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