• 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/objectTypeLiteral/callSignatures/callSignaturesWithOptionalParameters2.ts ===
20declare function AssertType(value:any, type:string):void;
21// Optional parameters should be valid in all the below casts
22
23function foo(x?: number);
24function foo(x?: number) { }
25
26foo(1);
27AssertType(foo(1), "any");
28AssertType(foo, "(?number) => any");
29AssertType(1, "int");
30
31foo();
32AssertType(foo(), "any");
33AssertType(foo, "(?number) => any");
34
35function foo2(x: number);
36function foo2(x: number, y?: number);
37function foo2(x: number, y?: number) { }
38
39foo2(1);
40AssertType(foo2(1), "any");
41AssertType(foo2, "{ (number): any; (number, ?number): any; }");
42AssertType(1, "int");
43
44foo2(1, 2);
45AssertType(foo2(1, 2), "any");
46AssertType(foo2, "{ (number): any; (number, ?number): any; }");
47AssertType(1, "int");
48AssertType(2, "int");
49
50class C {
51    foo(x?: number);
52    foo(x?: number) { }
53
54    foo2(x: number);
55    foo2(x: number, y?: number);
56    foo2(x: number, y?: number) { }
57}
58
59let c: C;
60AssertType(c, "C");
61
62c.foo();
63AssertType(c.foo(), "any");
64AssertType(c.foo, "(?number) => any");
65
66c.foo(1);
67AssertType(c.foo(1), "any");
68AssertType(c.foo, "(?number) => any");
69AssertType(1, "int");
70
71c.foo2(1);
72AssertType(c.foo2(1), "any");
73AssertType(c.foo2, "{ (number): any; (number, ?number): any; }");
74AssertType(1, "int");
75
76c.foo2(1, 2);
77AssertType(c.foo2(1, 2), "any");
78AssertType(c.foo2, "{ (number): any; (number, ?number): any; }");
79AssertType(1, "int");
80AssertType(2, "int");
81
82interface I {
83    (x?: number);
84    (x?: number, y?: number);
85    foo(x: number, y?: number);
86    foo(x: number, y?: number, z?: number);
87}
88
89let i: I;
90AssertType(i, "I");
91
92i();
93AssertType(i(), "any");
94AssertType(i, "I");
95
96i(1);
97AssertType(i(1), "any");
98AssertType(i, "I");
99AssertType(1, "int");
100
101i(1, 2);
102AssertType(i(1, 2), "any");
103AssertType(i, "I");
104AssertType(1, "int");
105AssertType(2, "int");
106
107i.foo(1);
108AssertType(i.foo(1), "any");
109AssertType(i.foo, "{ (number, ?number): any; (number, ?number, ?number): any; }");
110AssertType(1, "int");
111
112i.foo(1, 2);
113AssertType(i.foo(1, 2), "any");
114AssertType(i.foo, "{ (number, ?number): any; (number, ?number, ?number): any; }");
115AssertType(1, "int");
116AssertType(2, "int");
117
118i.foo(1, 2, 3);
119AssertType(i.foo(1, 2, 3), "any");
120AssertType(i.foo, "{ (number, ?number): any; (number, ?number, ?number): any; }");
121AssertType(1, "int");
122AssertType(2, "int");
123AssertType(3, "int");
124
125let a: {
126AssertType(a, "{ (?number): any; (?number, ?number): any; foo(number, ?number): any; foo(number, ?number, ?number): any; }");
127
128    (x?: number);
129AssertType(x, "number");
130
131    (x?: number, y?: number);
132AssertType(x, "number");
133AssertType(y, "number");
134
135    foo(x: number, y?: number);
136AssertType(foo, "{ (number, ?number): any; (number, ?number, ?number): any; }");
137AssertType(x, "number");
138AssertType(y, "number");
139
140    foo(x: number, y?: number, z?: number);
141AssertType(foo, "{ (number, ?number): any; (number, ?number, ?number): any; }");
142AssertType(x, "number");
143AssertType(y, "number");
144AssertType(z, "number");
145}
146
147a();
148AssertType(a(), "any");
149AssertType(a, "{ (?number): any; (?number, ?number): any; foo(number, ?number): any; foo(number, ?number, ?number): any; }");
150
151a(1);
152AssertType(a(1), "any");
153AssertType(a, "{ (?number): any; (?number, ?number): any; foo(number, ?number): any; foo(number, ?number, ?number): any; }");
154AssertType(1, "int");
155
156a(1, 2);
157AssertType(a(1, 2), "any");
158AssertType(a, "{ (?number): any; (?number, ?number): any; foo(number, ?number): any; foo(number, ?number, ?number): any; }");
159AssertType(1, "int");
160AssertType(2, "int");
161
162a.foo(1);
163AssertType(a.foo(1), "any");
164AssertType(a.foo, "{ (number, ?number): any; (number, ?number, ?number): any; }");
165AssertType(1, "int");
166
167a.foo(1, 2);
168AssertType(a.foo(1, 2), "any");
169AssertType(a.foo, "{ (number, ?number): any; (number, ?number, ?number): any; }");
170AssertType(1, "int");
171AssertType(2, "int");
172
173a.foo(1, 2, 3);
174AssertType(a.foo(1, 2, 3), "any");
175AssertType(a.foo, "{ (number, ?number): any; (number, ?number, ?number): any; }");
176AssertType(1, "int");
177AssertType(2, "int");
178AssertType(3, "int");
179
180
181