Skip to content

Commit 4a98c46

Browse files
committed
Merge pull request microsoft#2804 from Microsoft/unionPropertyAccess
Only public properties accessible through union type
2 parents 3309e75 + cae274d commit 4a98c46

File tree

4 files changed

+236
-1
lines changed

4 files changed

+236
-1
lines changed

src/compiler/checker.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2938,7 +2938,7 @@ module ts {
29382938
let type = getApparentType(current);
29392939
if (type !== unknownType) {
29402940
let prop = getPropertyOfType(type, name);
2941-
if (!prop) {
2941+
if (!prop || getDeclarationFlagsFromSymbol(prop) & (NodeFlags.Private | NodeFlags.Protected)) {
29422942
return undefined;
29432943
}
29442944
if (!props) {
Lines changed: 87 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,87 @@
1+
tests/cases/conformance/types/union/unionTypePropertyAccessibility.ts(35,1): error TS2445: Property 'member' is protected and only accessible within class 'Protected' and its subclasses.
2+
tests/cases/conformance/types/union/unionTypePropertyAccessibility.ts(36,1): error TS2341: Property 'member' is private and only accessible within class 'Private'.
3+
tests/cases/conformance/types/union/unionTypePropertyAccessibility.ts(38,4): error TS2339: Property 'member' does not exist on type 'Default | Protected'.
4+
tests/cases/conformance/types/union/unionTypePropertyAccessibility.ts(39,4): error TS2339: Property 'member' does not exist on type 'Default | Private'.
5+
tests/cases/conformance/types/union/unionTypePropertyAccessibility.ts(40,4): error TS2339: Property 'member' does not exist on type 'Public | Protected'.
6+
tests/cases/conformance/types/union/unionTypePropertyAccessibility.ts(41,4): error TS2339: Property 'member' does not exist on type 'Public | Private'.
7+
tests/cases/conformance/types/union/unionTypePropertyAccessibility.ts(42,5): error TS2339: Property 'member' does not exist on type 'Protected | Private'.
8+
tests/cases/conformance/types/union/unionTypePropertyAccessibility.ts(43,5): error TS2339: Property 'member' does not exist on type 'Default | Public | Protected'.
9+
tests/cases/conformance/types/union/unionTypePropertyAccessibility.ts(44,5): error TS2339: Property 'member' does not exist on type 'Default | Public | Private'.
10+
tests/cases/conformance/types/union/unionTypePropertyAccessibility.ts(45,5): error TS2339: Property 'member' does not exist on type 'Default | Protected | Private'.
11+
tests/cases/conformance/types/union/unionTypePropertyAccessibility.ts(46,5): error TS2339: Property 'member' does not exist on type 'Public | Protected | Private'.
12+
tests/cases/conformance/types/union/unionTypePropertyAccessibility.ts(47,5): error TS2339: Property 'member' does not exist on type 'Default | Public | Protected | Private'.
13+
14+
15+
==== tests/cases/conformance/types/union/unionTypePropertyAccessibility.ts (12 errors) ====
16+
class Default {
17+
member: string;
18+
}
19+
20+
class Public {
21+
public member: string;
22+
}
23+
24+
class Protected {
25+
protected member: string;
26+
}
27+
28+
class Private {
29+
private member: number;
30+
}
31+
32+
var v1: Default;
33+
var v2: Public;
34+
var v3: Protected;
35+
var v4: Private;
36+
var v5: Default | Public;
37+
var v6: Default | Protected;
38+
var v7: Default | Private;
39+
var v8: Public | Protected;
40+
var v9: Public | Private;
41+
var v10: Protected | Private;
42+
var v11: Default | Public | Protected;
43+
var v12: Default | Public | Private;
44+
var v13: Default | Protected | Private;
45+
var v14: Public | Private | Protected;
46+
var v15: Default | Public | Private | Protected;
47+
48+
v1.member;
49+
v2.member;
50+
v3.member;
51+
~~~~~~~~~
52+
!!! error TS2445: Property 'member' is protected and only accessible within class 'Protected' and its subclasses.
53+
v4.member;
54+
~~~~~~~~~
55+
!!! error TS2341: Property 'member' is private and only accessible within class 'Private'.
56+
v5.member;
57+
v6.member;
58+
~~~~~~
59+
!!! error TS2339: Property 'member' does not exist on type 'Default | Protected'.
60+
v7.member;
61+
~~~~~~
62+
!!! error TS2339: Property 'member' does not exist on type 'Default | Private'.
63+
v8.member;
64+
~~~~~~
65+
!!! error TS2339: Property 'member' does not exist on type 'Public | Protected'.
66+
v9.member;
67+
~~~~~~
68+
!!! error TS2339: Property 'member' does not exist on type 'Public | Private'.
69+
v10.member;
70+
~~~~~~
71+
!!! error TS2339: Property 'member' does not exist on type 'Protected | Private'.
72+
v11.member;
73+
~~~~~~
74+
!!! error TS2339: Property 'member' does not exist on type 'Default | Public | Protected'.
75+
v12.member;
76+
~~~~~~
77+
!!! error TS2339: Property 'member' does not exist on type 'Default | Public | Private'.
78+
v13.member;
79+
~~~~~~
80+
!!! error TS2339: Property 'member' does not exist on type 'Default | Protected | Private'.
81+
v14.member;
82+
~~~~~~
83+
!!! error TS2339: Property 'member' does not exist on type 'Public | Protected | Private'.
84+
v15.member;
85+
~~~~~~
86+
!!! error TS2339: Property 'member' does not exist on type 'Default | Public | Protected | Private'.
87+
Lines changed: 101 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,101 @@
1+
//// [unionTypePropertyAccessibility.ts]
2+
class Default {
3+
member: string;
4+
}
5+
6+
class Public {
7+
public member: string;
8+
}
9+
10+
class Protected {
11+
protected member: string;
12+
}
13+
14+
class Private {
15+
private member: number;
16+
}
17+
18+
var v1: Default;
19+
var v2: Public;
20+
var v3: Protected;
21+
var v4: Private;
22+
var v5: Default | Public;
23+
var v6: Default | Protected;
24+
var v7: Default | Private;
25+
var v8: Public | Protected;
26+
var v9: Public | Private;
27+
var v10: Protected | Private;
28+
var v11: Default | Public | Protected;
29+
var v12: Default | Public | Private;
30+
var v13: Default | Protected | Private;
31+
var v14: Public | Private | Protected;
32+
var v15: Default | Public | Private | Protected;
33+
34+
v1.member;
35+
v2.member;
36+
v3.member;
37+
v4.member;
38+
v5.member;
39+
v6.member;
40+
v7.member;
41+
v8.member;
42+
v9.member;
43+
v10.member;
44+
v11.member;
45+
v12.member;
46+
v13.member;
47+
v14.member;
48+
v15.member;
49+
50+
51+
//// [unionTypePropertyAccessibility.js]
52+
var Default = (function () {
53+
function Default() {
54+
}
55+
return Default;
56+
})();
57+
var Public = (function () {
58+
function Public() {
59+
}
60+
return Public;
61+
})();
62+
var Protected = (function () {
63+
function Protected() {
64+
}
65+
return Protected;
66+
})();
67+
var Private = (function () {
68+
function Private() {
69+
}
70+
return Private;
71+
})();
72+
var v1;
73+
var v2;
74+
var v3;
75+
var v4;
76+
var v5;
77+
var v6;
78+
var v7;
79+
var v8;
80+
var v9;
81+
var v10;
82+
var v11;
83+
var v12;
84+
var v13;
85+
var v14;
86+
var v15;
87+
v1.member;
88+
v2.member;
89+
v3.member;
90+
v4.member;
91+
v5.member;
92+
v6.member;
93+
v7.member;
94+
v8.member;
95+
v9.member;
96+
v10.member;
97+
v11.member;
98+
v12.member;
99+
v13.member;
100+
v14.member;
101+
v15.member;
Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
class Default {
2+
member: string;
3+
}
4+
5+
class Public {
6+
public member: string;
7+
}
8+
9+
class Protected {
10+
protected member: string;
11+
}
12+
13+
class Private {
14+
private member: number;
15+
}
16+
17+
var v1: Default;
18+
var v2: Public;
19+
var v3: Protected;
20+
var v4: Private;
21+
var v5: Default | Public;
22+
var v6: Default | Protected;
23+
var v7: Default | Private;
24+
var v8: Public | Protected;
25+
var v9: Public | Private;
26+
var v10: Protected | Private;
27+
var v11: Default | Public | Protected;
28+
var v12: Default | Public | Private;
29+
var v13: Default | Protected | Private;
30+
var v14: Public | Private | Protected;
31+
var v15: Default | Public | Private | Protected;
32+
33+
v1.member;
34+
v2.member;
35+
v3.member;
36+
v4.member;
37+
v5.member;
38+
v6.member;
39+
v7.member;
40+
v8.member;
41+
v9.member;
42+
v10.member;
43+
v11.member;
44+
v12.member;
45+
v13.member;
46+
v14.member;
47+
v15.member;

0 commit comments

Comments
 (0)