• 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/intersection/intersectionOfUnionOfUnitTypes.ts ===
20declare function AssertType(value:any, type:string):void;
21// @strict
22
23const enum E { A, B, C, D, E, F }
24
25let x0: ('a' | 'b' | 'c') & ('a' | 'b' | 'c');  // 'a' | 'b' | 'c'
26AssertType(x0, "union");
27
28let x1: ('a' | 'b' | 'c') & ('b' | 'c' | 'd');  // 'b' | 'c'
29AssertType(x1, "union");
30
31let x2: ('a' | 'b' | 'c') & ('c' | 'd' | 'e');  // 'c'
32AssertType(x2, "string");
33
34let x3: ('a' | 'b' | 'c') & ('d' | 'e' | 'f');  // never
35AssertType(x3, "never");
36
37let x4: ('a' | 'b' | 'c') & ('b' | 'c' | 'd') & ('c' | 'd' | 'e');  // 'c'
38AssertType(x4, "string");
39
40let x5: ('a' | 'b' | 'c') & ('b' | 'c' | 'd') & ('c' | 'd' | 'e') & ('d' | 'e' | 'f');  // never
41AssertType(x5, "never");
42
43let y0: (0 | 1 | 2) & (0 | 1 | 2);  // 0 | 1 | 2
44AssertType(y0, "union");
45
46let y1: (0 | 1 | 2) & (1 | 2 | 3);  // 1 | 2
47AssertType(y1, "union");
48
49let y2: (0 | 1 | 2) & (2 | 3 | 4);  // 2
50AssertType(y2, "int");
51
52let y3: (0 | 1 | 2) & (3 | 4 | 5);  // never
53AssertType(y3, "never");
54
55let y4: (0 | 1 | 2) & (1 | 2 | 3) & (2 | 3 | 4);  // 2
56AssertType(y4, "int");
57
58let y5: (0 | 1 | 2) & (1 | 2 | 3) & (2 | 3 | 4) & (3 | 4 | 5);  // never
59AssertType(y5, "never");
60
61let z0: (E.A | E.B | E.C) & (E.A | E.B | E.C);  // E.A | E.B | E.C
62AssertType(z0, "union");
63AssertType(E, "any");
64AssertType(E, "any");
65AssertType(E, "any");
66AssertType(E, "any");
67AssertType(E, "any");
68AssertType(E, "any");
69
70let z1: (E.A | E.B | E.C) & (E.B | E.C | E.D);  // E.B | E.C
71AssertType(z1, "union");
72AssertType(E, "any");
73AssertType(E, "any");
74AssertType(E, "any");
75AssertType(E, "any");
76AssertType(E, "any");
77AssertType(E, "any");
78
79let z2: (E.A | E.B | E.C) & (E.C | E.D | E.E);  // E.C
80AssertType(z2, "E.C");
81AssertType(E, "any");
82AssertType(E, "any");
83AssertType(E, "any");
84AssertType(E, "any");
85AssertType(E, "any");
86AssertType(E, "any");
87
88let z3: (E.A | E.B | E.C) & (E.D | E.E | E.F);  // never
89AssertType(z3, "never");
90AssertType(E, "any");
91AssertType(E, "any");
92AssertType(E, "any");
93AssertType(E, "any");
94AssertType(E, "any");
95AssertType(E, "any");
96
97let z4: (E.A | E.B | E.C) & (E.B | E.C | E.D) & (E.C | E.D | E.E);  // E.C
98AssertType(z4, "E.C");
99AssertType(E, "any");
100AssertType(E, "any");
101AssertType(E, "any");
102AssertType(E, "any");
103AssertType(E, "any");
104AssertType(E, "any");
105AssertType(E, "any");
106AssertType(E, "any");
107AssertType(E, "any");
108
109let z5: (E.A | E.B | E.C) & (E.B | E.C | E.D) & (E.C | E.D | E.E) & (E.D | E.E | E.F);  // never
110AssertType(z5, "never");
111AssertType(E, "any");
112AssertType(E, "any");
113AssertType(E, "any");
114AssertType(E, "any");
115AssertType(E, "any");
116AssertType(E, "any");
117AssertType(E, "any");
118AssertType(E, "any");
119AssertType(E, "any");
120AssertType(E, "any");
121AssertType(E, "any");
122AssertType(E, "any");
123
124
125