1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120
|
=== tests/cases/conformance/types/typeParameters/typeArgumentLists/typeParameterAsTypeParameterConstraint.ts ===
// using a type parameter as a constraint for a type parameter is valid
// no errors expected except illegal constraints
function foo<T, U extends T>(x: T, y: U): U { return y; }
>foo : <T, U extends T>(x: T, y: U) => U
>T : T
>U : U
>T : T
>x : T
>T : T
>y : U
>U : U
>U : U
>y : U
var r = foo(1, 2);
>r : number
>foo(1, 2) : 2
>foo : <T, U extends T>(x: T, y: U) => U
>1 : 1
>2 : 2
var r = foo({}, 1);
>r : number
>foo({}, 1) : 1
>foo : <T, U extends T>(x: T, y: U) => U
>{} : {}
>1 : 1
interface A {
>A : A
foo: string;
>foo : string
}
interface B extends A {
>B : B
>A : A
bar: number;
>bar : number
}
var a: A;
>a : A
>A : A
var b: B;
>b : B
>B : B
var r2 = foo(a, b);
>r2 : B
>foo(a, b) : B
>foo : <T, U extends T>(x: T, y: U) => U
>a : A
>b : B
var r3 = foo({ x: 1 }, { x: 2, y: 3 });
>r3 : { x: number; y: number; }
>foo({ x: 1 }, { x: 2, y: 3 }) : { x: number; y: number; }
>foo : <T, U extends T>(x: T, y: U) => U
>{ x: 1 } : { x: number; }
>x : number
>1 : 1
>{ x: 2, y: 3 } : { x: number; y: number; }
>x : number
>2 : 2
>y : number
>3 : 3
function foo2<T, U extends { length: T }>(x: T, y: U) { return y; }
>foo2 : <T, U extends { length: T; }>(x: T, y: U) => U
>T : T
>U : U
>length : T
>T : T
>x : T
>T : T
>y : U
>U : U
>y : U
foo2(1, '');
>foo2(1, '') : ""
>foo2 : <T, U extends { length: T; }>(x: T, y: U) => U
>1 : 1
>'' : ""
foo2({}, { length: 2 });
>foo2({}, { length: 2 }) : { length: number; }
>foo2 : <T, U extends { length: T; }>(x: T, y: U) => U
>{} : {}
>{ length: 2 } : { length: number; }
>length : number
>2 : 2
foo2(1, { width: 3, length: 2 });
>foo2(1, { width: 3, length: 2 }) : { width: number; length: number; }
>foo2 : <T, U extends { length: T; }>(x: T, y: U) => U
>1 : 1
>{ width: 3, length: 2 } : { width: number; length: number; }
>width : number
>3 : 3
>length : number
>2 : 2
foo2(1, []);
>foo2(1, []) : any[]
>foo2 : <T, U extends { length: T; }>(x: T, y: U) => U
>1 : 1
>[] : undefined[]
foo2(1, ['']);
>foo2(1, ['']) : string[]
>foo2 : <T, U extends { length: T; }>(x: T, y: U) => U
>1 : 1
>[''] : string[]
>'' : ""
|