Skip to content

Commit b143af3

Browse files
committed
Add tests
1 parent a20e59c commit b143af3

5 files changed

+578
-0
lines changed
Lines changed: 83 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,83 @@
1+
tests/cases/compiler/optionsStrictPropertyInitializationStrictNullChecks.ts(3,5): error TS2564: Property 'a' has no initializer and is not definitely assigned in the constructor.
2+
tests/cases/compiler/optionsStrictPropertyInitializationStrictNullChecks.ts(5,5): error TS2564: Property 'c' has no initializer and is not definitely assigned in the constructor.
3+
tests/cases/compiler/optionsStrictPropertyInitializationStrictNullChecks.ts(42,5): error TS2564: Property 'a' has no initializer and is not definitely assigned in the constructor.
4+
tests/cases/compiler/optionsStrictPropertyInitializationStrictNullChecks.ts(64,5): error TS2564: Property 'a' has no initializer and is not definitely assigned in the constructor.
5+
6+
7+
==== tests/cases/compiler/optionsStrictPropertyInitializationStrictNullChecks.ts (4 errors) ====
8+
// Properties with non-undefined types require initialization
9+
class C1 {
10+
a: number; // Error
11+
~
12+
!!! error TS2564: Property 'a' has no initializer and is not definitely assigned in the constructor.
13+
b: number | undefined;
14+
c: number | null; // Error
15+
~
16+
!!! error TS2564: Property 'c' has no initializer and is not definitely assigned in the constructor.
17+
d?: number;
18+
}
19+
20+
// No strict initialization checks in ambient contexts
21+
declare class C2 {
22+
a: number;
23+
b: number | undefined;
24+
c: number | null;
25+
d?: number;
26+
}
27+
28+
// No strict initialization checks for static members
29+
class C3 {
30+
static a: number;
31+
static b: number | undefined;
32+
static c: number | null;
33+
static d?: number;
34+
}
35+
36+
// Initializer satisfies strict initialization check
37+
class C4 {
38+
a = 0;
39+
b: number = 0;
40+
c: string = "abc";
41+
}
42+
43+
// Assignment in constructor satisfies strict initialization check
44+
class C5 {
45+
a: number;
46+
constructor() {
47+
this.a = 0;
48+
}
49+
}
50+
51+
// All code paths must contain assignment
52+
class C6 {
53+
a: number; // Error
54+
~
55+
!!! error TS2564: Property 'a' has no initializer and is not definitely assigned in the constructor.
56+
constructor(cond: boolean) {
57+
if (cond) {
58+
return;
59+
}
60+
this.a = 0;
61+
}
62+
}
63+
64+
class C7 {
65+
a: number;
66+
constructor(cond: boolean) {
67+
if (cond) {
68+
this.a = 1;
69+
return;
70+
}
71+
this.a = 0;
72+
}
73+
}
74+
75+
// Properties with string literal names aren't checked
76+
class C8 {
77+
a: number; // Error
78+
~
79+
!!! error TS2564: Property 'a' has no initializer and is not definitely assigned in the constructor.
80+
"b": number;
81+
0: number;
82+
}
83+
Lines changed: 125 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,125 @@
1+
//// [optionsStrictPropertyInitializationStrictNullChecks.ts]
2+
// Properties with non-undefined types require initialization
3+
class C1 {
4+
a: number; // Error
5+
b: number | undefined;
6+
c: number | null; // Error
7+
d?: number;
8+
}
9+
10+
// No strict initialization checks in ambient contexts
11+
declare class C2 {
12+
a: number;
13+
b: number | undefined;
14+
c: number | null;
15+
d?: number;
16+
}
17+
18+
// No strict initialization checks for static members
19+
class C3 {
20+
static a: number;
21+
static b: number | undefined;
22+
static c: number | null;
23+
static d?: number;
24+
}
25+
26+
// Initializer satisfies strict initialization check
27+
class C4 {
28+
a = 0;
29+
b: number = 0;
30+
c: string = "abc";
31+
}
32+
33+
// Assignment in constructor satisfies strict initialization check
34+
class C5 {
35+
a: number;
36+
constructor() {
37+
this.a = 0;
38+
}
39+
}
40+
41+
// All code paths must contain assignment
42+
class C6 {
43+
a: number; // Error
44+
constructor(cond: boolean) {
45+
if (cond) {
46+
return;
47+
}
48+
this.a = 0;
49+
}
50+
}
51+
52+
class C7 {
53+
a: number;
54+
constructor(cond: boolean) {
55+
if (cond) {
56+
this.a = 1;
57+
return;
58+
}
59+
this.a = 0;
60+
}
61+
}
62+
63+
// Properties with string literal names aren't checked
64+
class C8 {
65+
a: number; // Error
66+
"b": number;
67+
0: number;
68+
}
69+
70+
71+
//// [optionsStrictPropertyInitializationStrictNullChecks.js]
72+
// Properties with non-undefined types require initialization
73+
var C1 = /** @class */ (function () {
74+
function C1() {
75+
}
76+
return C1;
77+
}());
78+
// No strict initialization checks for static members
79+
var C3 = /** @class */ (function () {
80+
function C3() {
81+
}
82+
return C3;
83+
}());
84+
// Initializer satisfies strict initialization check
85+
var C4 = /** @class */ (function () {
86+
function C4() {
87+
this.a = 0;
88+
this.b = 0;
89+
this.c = "abc";
90+
}
91+
return C4;
92+
}());
93+
// Assignment in constructor satisfies strict initialization check
94+
var C5 = /** @class */ (function () {
95+
function C5() {
96+
this.a = 0;
97+
}
98+
return C5;
99+
}());
100+
// All code paths must contain assignment
101+
var C6 = /** @class */ (function () {
102+
function C6(cond) {
103+
if (cond) {
104+
return;
105+
}
106+
this.a = 0;
107+
}
108+
return C6;
109+
}());
110+
var C7 = /** @class */ (function () {
111+
function C7(cond) {
112+
if (cond) {
113+
this.a = 1;
114+
return;
115+
}
116+
this.a = 0;
117+
}
118+
return C7;
119+
}());
120+
// Properties with string literal names aren't checked
121+
var C8 = /** @class */ (function () {
122+
function C8() {
123+
}
124+
return C8;
125+
}());
Lines changed: 143 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,143 @@
1+
=== tests/cases/compiler/optionsStrictPropertyInitializationStrictNullChecks.ts ===
2+
// Properties with non-undefined types require initialization
3+
class C1 {
4+
>C1 : Symbol(C1, Decl(optionsStrictPropertyInitializationStrictNullChecks.ts, 0, 0))
5+
6+
a: number; // Error
7+
>a : Symbol(C1.a, Decl(optionsStrictPropertyInitializationStrictNullChecks.ts, 1, 10))
8+
9+
b: number | undefined;
10+
>b : Symbol(C1.b, Decl(optionsStrictPropertyInitializationStrictNullChecks.ts, 2, 14))
11+
12+
c: number | null; // Error
13+
>c : Symbol(C1.c, Decl(optionsStrictPropertyInitializationStrictNullChecks.ts, 3, 26))
14+
15+
d?: number;
16+
>d : Symbol(C1.d, Decl(optionsStrictPropertyInitializationStrictNullChecks.ts, 4, 21))
17+
}
18+
19+
// No strict initialization checks in ambient contexts
20+
declare class C2 {
21+
>C2 : Symbol(C2, Decl(optionsStrictPropertyInitializationStrictNullChecks.ts, 6, 1))
22+
23+
a: number;
24+
>a : Symbol(C2.a, Decl(optionsStrictPropertyInitializationStrictNullChecks.ts, 9, 18))
25+
26+
b: number | undefined;
27+
>b : Symbol(C2.b, Decl(optionsStrictPropertyInitializationStrictNullChecks.ts, 10, 14))
28+
29+
c: number | null;
30+
>c : Symbol(C2.c, Decl(optionsStrictPropertyInitializationStrictNullChecks.ts, 11, 26))
31+
32+
d?: number;
33+
>d : Symbol(C2.d, Decl(optionsStrictPropertyInitializationStrictNullChecks.ts, 12, 21))
34+
}
35+
36+
// No strict initialization checks for static members
37+
class C3 {
38+
>C3 : Symbol(C3, Decl(optionsStrictPropertyInitializationStrictNullChecks.ts, 14, 1))
39+
40+
static a: number;
41+
>a : Symbol(C3.a, Decl(optionsStrictPropertyInitializationStrictNullChecks.ts, 17, 10))
42+
43+
static b: number | undefined;
44+
>b : Symbol(C3.b, Decl(optionsStrictPropertyInitializationStrictNullChecks.ts, 18, 21))
45+
46+
static c: number | null;
47+
>c : Symbol(C3.c, Decl(optionsStrictPropertyInitializationStrictNullChecks.ts, 19, 33))
48+
49+
static d?: number;
50+
>d : Symbol(C3.d, Decl(optionsStrictPropertyInitializationStrictNullChecks.ts, 20, 28))
51+
}
52+
53+
// Initializer satisfies strict initialization check
54+
class C4 {
55+
>C4 : Symbol(C4, Decl(optionsStrictPropertyInitializationStrictNullChecks.ts, 22, 1))
56+
57+
a = 0;
58+
>a : Symbol(C4.a, Decl(optionsStrictPropertyInitializationStrictNullChecks.ts, 25, 10))
59+
60+
b: number = 0;
61+
>b : Symbol(C4.b, Decl(optionsStrictPropertyInitializationStrictNullChecks.ts, 26, 10))
62+
63+
c: string = "abc";
64+
>c : Symbol(C4.c, Decl(optionsStrictPropertyInitializationStrictNullChecks.ts, 27, 18))
65+
}
66+
67+
// Assignment in constructor satisfies strict initialization check
68+
class C5 {
69+
>C5 : Symbol(C5, Decl(optionsStrictPropertyInitializationStrictNullChecks.ts, 29, 1))
70+
71+
a: number;
72+
>a : Symbol(C5.a, Decl(optionsStrictPropertyInitializationStrictNullChecks.ts, 32, 10))
73+
74+
constructor() {
75+
this.a = 0;
76+
>this.a : Symbol(C5.a, Decl(optionsStrictPropertyInitializationStrictNullChecks.ts, 32, 10))
77+
>this : Symbol(C5, Decl(optionsStrictPropertyInitializationStrictNullChecks.ts, 29, 1))
78+
>a : Symbol(C5.a, Decl(optionsStrictPropertyInitializationStrictNullChecks.ts, 32, 10))
79+
}
80+
}
81+
82+
// All code paths must contain assignment
83+
class C6 {
84+
>C6 : Symbol(C6, Decl(optionsStrictPropertyInitializationStrictNullChecks.ts, 37, 1))
85+
86+
a: number; // Error
87+
>a : Symbol(C6.a, Decl(optionsStrictPropertyInitializationStrictNullChecks.ts, 40, 10))
88+
89+
constructor(cond: boolean) {
90+
>cond : Symbol(cond, Decl(optionsStrictPropertyInitializationStrictNullChecks.ts, 42, 16))
91+
92+
if (cond) {
93+
>cond : Symbol(cond, Decl(optionsStrictPropertyInitializationStrictNullChecks.ts, 42, 16))
94+
95+
return;
96+
}
97+
this.a = 0;
98+
>this.a : Symbol(C6.a, Decl(optionsStrictPropertyInitializationStrictNullChecks.ts, 40, 10))
99+
>this : Symbol(C6, Decl(optionsStrictPropertyInitializationStrictNullChecks.ts, 37, 1))
100+
>a : Symbol(C6.a, Decl(optionsStrictPropertyInitializationStrictNullChecks.ts, 40, 10))
101+
}
102+
}
103+
104+
class C7 {
105+
>C7 : Symbol(C7, Decl(optionsStrictPropertyInitializationStrictNullChecks.ts, 48, 1))
106+
107+
a: number;
108+
>a : Symbol(C7.a, Decl(optionsStrictPropertyInitializationStrictNullChecks.ts, 50, 10))
109+
110+
constructor(cond: boolean) {
111+
>cond : Symbol(cond, Decl(optionsStrictPropertyInitializationStrictNullChecks.ts, 52, 16))
112+
113+
if (cond) {
114+
>cond : Symbol(cond, Decl(optionsStrictPropertyInitializationStrictNullChecks.ts, 52, 16))
115+
116+
this.a = 1;
117+
>this.a : Symbol(C7.a, Decl(optionsStrictPropertyInitializationStrictNullChecks.ts, 50, 10))
118+
>this : Symbol(C7, Decl(optionsStrictPropertyInitializationStrictNullChecks.ts, 48, 1))
119+
>a : Symbol(C7.a, Decl(optionsStrictPropertyInitializationStrictNullChecks.ts, 50, 10))
120+
121+
return;
122+
}
123+
this.a = 0;
124+
>this.a : Symbol(C7.a, Decl(optionsStrictPropertyInitializationStrictNullChecks.ts, 50, 10))
125+
>this : Symbol(C7, Decl(optionsStrictPropertyInitializationStrictNullChecks.ts, 48, 1))
126+
>a : Symbol(C7.a, Decl(optionsStrictPropertyInitializationStrictNullChecks.ts, 50, 10))
127+
}
128+
}
129+
130+
// Properties with string literal names aren't checked
131+
class C8 {
132+
>C8 : Symbol(C8, Decl(optionsStrictPropertyInitializationStrictNullChecks.ts, 59, 1))
133+
134+
a: number; // Error
135+
>a : Symbol(C8.a, Decl(optionsStrictPropertyInitializationStrictNullChecks.ts, 62, 10))
136+
137+
"b": number;
138+
>"b" : Symbol(C8["b"], Decl(optionsStrictPropertyInitializationStrictNullChecks.ts, 63, 14))
139+
140+
0: number;
141+
>0 : Symbol(C8[0], Decl(optionsStrictPropertyInitializationStrictNullChecks.ts, 64, 16))
142+
}
143+

0 commit comments

Comments
 (0)