File: varianceMeasurement.types

package info (click to toggle)
node-typescript 4.9.5%2Bds1-2
  • links: PTS, VCS
  • area: main
  • in suites: sid, trixie
  • size: 533,908 kB
  • sloc: javascript: 2,018,330; makefile: 7; sh: 1
file content (155 lines) | stat: -rw-r--r-- 3,025 bytes parent folder | download | duplicates (4)
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
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
=== tests/cases/compiler/varianceMeasurement.ts ===
// The type below should be invariant in T but is measured as covariant because
// we don't analyze recursive references.

interface Foo1<T> {
  x: T;
>x : T

  y: Foo1<(arg: T) => void>;
>y : Foo1<(arg: T) => void>
>arg : T
}

declare const f10: Foo1<string>;
>f10 : Foo1<string>

const f11: Foo1<'a'> = f10;
>f11 : Foo1<"a">
>f10 : Foo1<string>

const f12: Foo1<unknown> = f10;
>f12 : Foo1<unknown>
>f10 : Foo1<string>

// The type below is invariant in T and is measured as such.

interface Foo2<T> {
  x: T;
>x : T

  y: { x: (arg: T) => void, y: Foo2<(arg: T) => void>; }
>y : { x: (arg: T) => void; y: Foo2<(arg: T) => void>; }
>x : (arg: T) => void
>arg : T
>y : Foo2<(arg: T) => void>
>arg : T
}

declare const f20: Foo2<string>;
>f20 : Foo2<string>

const f21: Foo2<'a'> = f20;
>f21 : Foo2<"a">
>f20 : Foo2<string>

const f22: Foo2<unknown> = f20;
>f22 : Foo2<unknown>
>f20 : Foo2<string>

// The type below should be invariant in T but is measured as covariant because
// we don't analyze recursive references.

type Foo3<T> = {
>Foo3 : Foo3<T>

  x: T;
>x : T

  y: Foo3<(arg: T) => void>;
>y : Foo3<(arg: T) => void>
>arg : T
}

declare const f30: Foo3<string>;
>f30 : Foo3<string>

const f31: Foo3<'a'> = f30;
>f31 : Foo3<"a">
>f30 : Foo3<string>

const f32: Foo3<unknown> = f30;
>f32 : Foo3<unknown>
>f30 : Foo3<string>

// The type below is invariant in T and is measured as such.

type Foo4<T> = {
>Foo4 : Foo4<T>

  x: T;
>x : T

  y: { x: (arg: T) => void, y: Foo4<(arg: T) => void>; }
>y : { x: (arg: T) => void; y: Foo4<(arg: T) => void>; }
>x : (arg: T) => void
>arg : T
>y : Foo4<(arg: T) => void>
>arg : T
}

declare const f40: Foo4<string>;
>f40 : Foo4<string>

const f41: Foo4<'a'> = f40;
>f41 : Foo4<"a">
>f40 : Foo4<string>

const f42: Foo4<unknown> = f40;
>f42 : Foo4<unknown>
>f40 : Foo4<string>

// Repro from #3580

interface Fn<A, B> {
  (a: A): B;
>a : A

  then<C>(next: Fn<B, C>): Fn<A, C>;
>then : <C>(next: Fn<B, C>) => Fn<A, C>
>next : Fn<B, C>
}

declare const fn: Fn<string, number>;
>fn : Fn<string, number>

// Contravariant in A
const fn1: Fn<unknown, number> = fn;  // Error
>fn1 : Fn<unknown, number>
>fn : Fn<string, number>

const fn2: Fn<'a', number> = fn;
>fn2 : Fn<"a", number>
>fn : Fn<string, number>

// Covariant in B
const fn3: Fn<string, unknown> = fn;
>fn3 : Fn<string, unknown>
>fn : Fn<string, number>

const fn4: Fn<string, 0> = fn;  // Error
>fn4 : Fn<string, 0>
>fn : Fn<string, number>

// Repro from #39947

interface I<Dummy, V> {
  c: C<Dummy, V>;
>c : C<Dummy, V>
}

class C<Dummy, V> {
>C : C<Dummy, V>

  declare sub: I<Dummy, V>;
>sub : I<Dummy, V>

  declare covariance: V;
>covariance : V
}

const c1: C<unknown, string> = new C<unknown, number>();  // Error
>c1 : C<unknown, string>
>new C<unknown, number>() : C<unknown, number>
>C : typeof C