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