File: typeParameterAssignability2.js

package info (click to toggle)
node-typescript 3.3.3333-1
  • links: PTS, VCS
  • area: main
  • in suites: buster
  • size: 324,548 kB
  • sloc: makefile: 6; sh: 3
file content (131 lines) | stat: -rw-r--r-- 2,565 bytes parent folder | download | duplicates (7)
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
}