• 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/expressions/contextualTyping/superCallParameterContextualTyping3.ts ===
20declare function AssertType(value:any, type:string):void;
21interface ContextualType<T> {
22    method(parameter: T): void;
23}
24
25class CBase<T>  {
26    constructor(param: ContextualType<T>) {
27    }
28
29    foo(param: ContextualType<T>) {
30    }
31}
32
33class C extends CBase<string> {
34    constructor() {
35        // Should be okay.
36        // 'p' should have type 'string'.
37        super({
38AssertType(super({            method(p) {                p.length;            }        }), "void");
39AssertType(super, "typeof CBase");
40AssertType({            method(p) {                p.length;            }        }, "{ method(string): void; }");
41
42            method(p) {
43AssertType(method, "(string) => void");
44AssertType(p, "string");
45
46                p.length;
47AssertType(p.length, "number");
48            }
49        });
50
51        // Should be okay.
52        // 'p' should have type 'string'.
53        super.foo({
54AssertType(super.foo({            method(p) {                p.length;            }        }), "void");
55AssertType(super.foo, "(ContextualType<string>) => void");
56AssertType(super, "CBase<string>");
57AssertType({            method(p) {                p.length;            }        }, "{ method(string): void; }");
58
59            method(p) {
60AssertType(method, "(string) => void");
61AssertType(p, "string");
62
63                p.length;
64AssertType(p.length, "number");
65            }
66        });
67    }
68}
69
70