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