1/*
2 * Copyright (c) 2022-2024 Huawei Device Co., Ltd.
3 * Licensed under the Apache License, Version 2.0 (the "License");
4 * you may not use this file except in compliance with the License.
5 * You may obtain a copy of the License at
6 *
7 * http://www.apache.org/licenses/LICENSE-2.0
8 *
9 * Unless required by applicable law or agreed to in writing, software
10 * distributed under the License is distributed on an "AS IS" BASIS,
11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 * See the License for the specific language governing permissions and
13 * limitations under the License.
14 */
15
16
17var a: any;
18var a: any;
19
20var b: number;
21var b: number;
22
23var c: number | string;
24var c: string | number;
25
26var d: { a: number, b: string };
27var d: { b: string, a: number };
28
29var e: (a: number, b: (string | number)[]) => void;
30var e: (a: number, b: (string | number)[]) => void;
31
32var f: { a: number, b: string } | { a: number[], b?: string };
33var f: { a: number, b: string } | { a: number[], b?: string };
34
35interface interface1 {
36    a: number,
37    b: string,
38}
39
40interface interface2 {
41    a: number,
42    b: string,
43}
44
45var g: interface1;
46var g: interface2;
47
48interface interface3 extends interface1 {
49    c: boolean,
50}
51
52interface interface4 extends interface2 {
53    c: boolean,
54}
55
56var h: interface3;
57var h: interface4;
58
59interface interface5 {
60    (a: number, b: string): number,
61    (a: number, b: string): string,
62    new(a: number[], b: { a: number, b: string }): boolean,
63    new(a: number[], b: { a: number, b: string }): void,
64}
65
66interface interface6 {
67    (a: number, b: string): number,
68    (a: number, b: string): string,
69    new(a: number[], b: { a: number, b: string }): void,
70    new(a: number[], b: { a: number, b: string }): boolean,
71}
72
73var i: interface5;
74var i: interface6;
75
76var j = function (a: interface6, b: number[]): number {
77    return 123;
78}
79var j: (a: interface6, b: number[]) => number;
80
81var obj = { a: 1, b: 2, c: 3 };
82var k = { d: "foo", e: "bar", ...obj };
83var k: { a: number, b: number, c: number, d: string, e: string };
84
85function func1(a: number, b: string): "foo" {
86    return "foo";
87}
88function func2(a: string, b: number): true {
89    return true;
90}
91var l: typeof func1 | typeof func2;
92var l: ((a: number, b: string) => "foo") | ((a: string, b: number) => true)
93
94var m: [a: number, b: string, c: boolean];
95var m: [number, string, boolean];
96
97var n: number[] | [1, 2, 3];
98var n: [1, 2, 3] | number[];
99
100interface interface7 {
101    a: number,
102}
103
104interface interface8 extends interface7 {
105    a: number,
106}
107
108interface interface9 {
109    a: number;
110}
111
112var o: interface9;
113var o: interface8;
114
115var p: { a: number, b: string };
116var p: typeof p;
117