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 121 122 123 124 125 126 127 128 129 130 131
|
//// [typeParameterAssignability2.ts]
// type parameters are not assignable to one another unless directly or indirectly constrained to one another
function foo<T, U extends T>(t: T, u: U) {
t = u; // error
u = t; // ok
}
function foo2<T extends U, U>(t: T, u: U) {
t = u; // error
u = t; // ok
}
function foo3<T extends U, U extends V, V>(t: T, u: U, v: V) {
t = u; // error
u = t;
t = v; // error
v = t; // ok
u = v; // error
v = u; // ok
}
function foo4<T extends U, U extends V, V extends Date>(t: T, u: U, v: V) {
t = u; // error
t = v; // error
t = new Date(); // error
u = t;
u = v; // error
u = new Date(); // error
v = t;
v = u;
v = new Date(); // ok
var d: Date;
d = t; // ok
d = u; // ok
d = v; // ok
}
// same as foo4 with different type parameter ordering
function foo5<V extends Date, U extends V, T extends U>(t: T, u: U, v: V) {
t = u; // error
t = v; // error
t = new Date(); // error
u = t;
u = v; // error
u = new Date(); // error
v = t;
v = u;
v = new Date(); // ok
var d: Date;
d = t; // ok
d = u; // ok
d = v; // ok
}
function foo6<T extends U, U, V>(t: T, u: U, v: V) {
t = u; // error
t = v; // error
u = t; // ok
u = v; // error
v = t; // error
v = u; // error
}
//// [typeParameterAssignability2.js]
// type parameters are not assignable to one another unless directly or indirectly constrained to one another
function foo(t, u) {
t = u; // error
u = t; // ok
}
function foo2(t, u) {
t = u; // error
u = t; // ok
}
function foo3(t, u, v) {
t = u; // error
u = t;
t = v; // error
v = t; // ok
u = v; // error
v = u; // ok
}
function foo4(t, u, v) {
t = u; // error
t = v; // error
t = new Date(); // error
u = t;
u = v; // error
u = new Date(); // error
v = t;
v = u;
v = new Date(); // ok
var d;
d = t; // ok
d = u; // ok
d = v; // ok
}
// same as foo4 with different type parameter ordering
function foo5(t, u, v) {
t = u; // error
t = v; // error
t = new Date(); // error
u = t;
u = v; // error
u = new Date(); // error
v = t;
v = u;
v = new Date(); // ok
var d;
d = t; // ok
d = u; // ok
d = v; // ok
}
function foo6(t, u, v) {
t = u; // error
t = v; // error
u = t; // ok
u = v; // error
v = t; // error
v = u; // error
}
|