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