• 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/typeRelationships/typeAndMemberIdentity/typeParametersAreIdenticalToThemselves.ts ===
20declare function AssertType(value:any, type:string):void;
21// type parameters from the same declaration are identical to themself
22
23function foo1<T>(x: T);
24function foo1<T>(x: T); // no error, different declaration for each T
25function foo1<T>(x: T) { }
26
27function foo2<T, U>(x: T);
28function foo2<T, U>(x: T); // no error, different declaration for each T
29function foo2<T, U>(x: T) { }
30
31function foo3<T, U>(x: T, y: U) {
32    function inner(x: T);
33AssertType(inner, "{ (T): any; (T): any; }");
34AssertType(x, "T");
35
36    function inner(x: T); // error, same T
37AssertType(inner, "{ (T): any; (T): any; }");
38AssertType(x, "T");
39
40    function inner(x: T) {
41AssertType(inner, "{ (T): any; (T): any; }");
42
43AssertType(x, "T");
44}
45
46    function inner2(x: T);
47AssertType(inner2, "{ (T): any; <T>(T): any; }");
48AssertType(x, "T");
49
50    function inner2<T>(x: T); // no error, different T
51AssertType(inner2, "{ (T): any; <T>(T): any; }");
52AssertType(x, "T");
53
54    function inner2(x: any) {
55AssertType(inner2, "{ (T): any; <T>(T): any; }");
56
57AssertType(x, "any");
58}
59}
60
61class C<T> {
62    foo1(x: T);
63    foo1(x: T); // error, same T
64    foo1(x: T) { }
65
66    foo2<U>(a: T, x: U);
67    foo2<U>(a: T, x: U); // no error, different declaration for each U
68    foo2<U>(a: T, x: U) { }
69
70    foo3<T>(x: T);
71    foo3<T>(x: T); // no error, different declaration for each T
72    foo3<T>(x: T) { }
73
74    foo4<T extends Date>(x: T);
75    foo4<T extends Date>(x: T); // no error, different declaration for each T
76    foo4<T extends Date>(x: T) { }
77}
78
79class C2<T extends Date> {
80    foo1(x: T);
81    foo1(x: T); // error, same T
82    foo1(x: T) { }
83
84    foo2<U>(a: T, x: U);
85    foo2<U>(a: T, x: U); // no error, different declaration for each U
86    foo2<U>(a: T, x: U) { }
87
88    foo3<T>(x: T);
89    foo3<T>(x: T); // no error, different declaration for each T
90    foo3<T>(x: T) { }
91}
92
93interface I<T> {
94    foo1(x: T);
95    foo1(x: T); // error, same T
96
97    foo2<U>(a: T, x: U);
98    foo2<U>(a: T, x: U); // no error, different declaration for each U
99
100    foo3<T>(x: T);
101    foo3<T>(x: T); // no error, different declaration for each T
102
103    foo4<T extends Date>(x: T);
104    foo4<T extends Date>(x: T); // no error, different declaration for each T
105}
106
107interface I2<T extends Date> {
108    foo1(x: T);
109    foo1(x: T); // error, same T
110
111    foo2<U>(a: T, x: U);
112    foo2<U>(a: T, x: U); // no error, different declaration for each U
113
114    foo3<T>(x: T);
115    foo3<T>(x: T); // no error, different declaration for each T
116}
117
118