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