Skip to content

Commit 23162c2

Browse files
committed
Add tests
1 parent 2cc1d73 commit 23162c2

File tree

1 file changed

+127
-0
lines changed

1 file changed

+127
-0
lines changed
Lines changed: 127 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,127 @@
1+
// @strict: true
2+
// @declaration: true
3+
4+
type T00<T> = { [P in keyof T]: T[P] };
5+
type T01<T> = { [P in keyof T]?: T[P] };
6+
type T02<T> = { [P in keyof T]+?: T[P] };
7+
type T03<T> = { [P in keyof T]-?: T[P] };
8+
9+
type T04<T> = { readonly [P in keyof T]: T[P] };
10+
type T05<T> = { readonly [P in keyof T]?: T[P] };
11+
type T06<T> = { readonly [P in keyof T]+?: T[P] };
12+
type T07<T> = { readonly [P in keyof T]-?: T[P] };
13+
14+
type T08<T> = { +readonly [P in keyof T]: T[P] };
15+
type T09<T> = { +readonly [P in keyof T]?: T[P] };
16+
type T10<T> = { +readonly [P in keyof T]+?: T[P] };
17+
type T11<T> = { +readonly [P in keyof T]-?: T[P] };
18+
19+
type T12<T> = { -readonly [P in keyof T]: T[P] };
20+
type T13<T> = { -readonly [P in keyof T]?: T[P] };
21+
type T14<T> = { -readonly [P in keyof T]+?: T[P] };
22+
type T15<T> = { -readonly [P in keyof T]-?: T[P] };
23+
24+
function f1<T>(x: Required<T>, y: T, z: Partial<T>) {
25+
x = x;
26+
x = y; // Error
27+
x = z; // Error
28+
y = x;
29+
y = y;
30+
y = z; // Error
31+
z = x;
32+
z = y;
33+
z = z;
34+
}
35+
36+
type Denullified<T> = { [P in keyof T]-?: NonNullable<T[P]> };
37+
38+
function f2<T>(w: Denullified<T>, x: Required<T>, y: T, z: Partial<T>) {
39+
w = w;
40+
w = x; // Error
41+
w = y; // Error
42+
w = z; // Error
43+
x = w;
44+
x = x;
45+
x = y; // Error
46+
x = z; // Error
47+
y = w;
48+
y = x;
49+
y = y;
50+
y = z; // Error
51+
z = w;
52+
z = x;
53+
z = y;
54+
z = z;
55+
}
56+
57+
58+
function f3<T>(w: Denullified<T>, x: Required<T>, y: T, z: Partial<T>) {
59+
w = {}; // Error
60+
x = {}; // Error
61+
y = {}; // Error
62+
z = {};
63+
}
64+
65+
type Readwrite<T> = {
66+
-readonly [P in keyof T]: T[P];
67+
}
68+
69+
function f10<T>(x: Readonly<T>, y: T, z: Readwrite<T>) {
70+
x = x;
71+
x = y;
72+
x = z;
73+
y = x;
74+
y = y;
75+
y = z;
76+
z = x;
77+
z = y;
78+
z = z;
79+
}
80+
81+
type Foo = {
82+
a: number;
83+
b: number | undefined;
84+
c?: number;
85+
d?: number | undefined;
86+
}
87+
88+
declare let x1: Foo;
89+
90+
x1.a; // number
91+
x1.b; // number | undefined
92+
x1.c; // number | undefined
93+
x1.d; // number | undefined
94+
95+
x1 = { a: 1 }; // Error
96+
x1 = { a: 1, b: 1 };
97+
x1 = { a: 1, b: 1, c: 1 };
98+
x1 = { a: 1, b: 1, c: 1, d: 1 };
99+
100+
declare let x2: Required<Foo>;
101+
102+
x1.a; // number
103+
x1.b; // number | undefined
104+
x1.c; // number
105+
x1.d; // number
106+
107+
x2 = { a: 1 }; // Error
108+
x2 = { a: 1, b: 1 }; // Error
109+
x2 = { a: 1, b: 1, c: 1 }; // Error
110+
x2 = { a: 1, b: 1, c: 1, d: 1 };
111+
112+
type Bar = {
113+
a: number;
114+
readonly b: number;
115+
}
116+
117+
declare let x3: Bar;
118+
x3.a = 1;
119+
x3.b = 1; // Error
120+
121+
declare let x4: Readonly<Bar>;
122+
x4.a = 1; // Error
123+
x4.b = 1; // Error
124+
125+
declare let x5: Readwrite<Bar>;
126+
x5.a = 1;
127+
x5.b = 1;

0 commit comments

Comments
 (0)