tests/cases/compiler/protectedMembers.ts(40,1): error TS2445: Property 'x' is protected and only accessible within class 'C1' and its subclasses. tests/cases/compiler/protectedMembers.ts(41,1): error TS2445: Property 'f' is protected and only accessible within class 'C1' and its subclasses. tests/cases/compiler/protectedMembers.ts(42,1): error TS2445: Property 'sx' is protected and only accessible within class 'C1' and its subclasses. tests/cases/compiler/protectedMembers.ts(43,1): error TS2445: Property 'sf' is protected and only accessible within class 'C1' and its subclasses. tests/cases/compiler/protectedMembers.ts(46,1): error TS2445: Property 'x' is protected and only accessible within class 'C1' and its subclasses. tests/cases/compiler/protectedMembers.ts(47,1): error TS2445: Property 'f' is protected and only accessible within class 'C2' and its subclasses. tests/cases/compiler/protectedMembers.ts(48,1): error TS2445: Property 'sx' is protected and only accessible within class 'C1' and its subclasses. tests/cases/compiler/protectedMembers.ts(49,1): error TS2445: Property 'sf' is protected and only accessible within class 'C2' and its subclasses. tests/cases/compiler/protectedMembers.ts(68,9): error TS2446: Property 'x' is protected and only accessible through an instance of class 'C'. tests/cases/compiler/protectedMembers.ts(69,9): error TS2446: Property 'x' is protected and only accessible through an instance of class 'C'. tests/cases/compiler/protectedMembers.ts(86,5): error TS1089: 'protected' modifier cannot appear on a constructor declaration. tests/cases/compiler/protectedMembers.ts(98,1): error TS2322: Type 'B1' is not assignable to type 'A1'. Property 'x' is protected but type 'B1' is not a class derived from 'A1'. tests/cases/compiler/protectedMembers.ts(99,1): error TS2322: Type 'A1' is not assignable to type 'B1'. Property 'x' is protected in type 'A1' but public in type 'B1'. tests/cases/compiler/protectedMembers.ts(112,7): error TS2415: Class 'B3' incorrectly extends base class 'A3'. Property 'x' is protected in type 'B3' but public in type 'A3'. ==== tests/cases/compiler/protectedMembers.ts (14 errors) ==== // Class with protected members class C1 { protected x: number; protected static sx: number; protected f() { return this.x; } protected static sf() { return this.sx; } } // Derived class accessing protected members class C2 extends C1 { protected f() { return super.f() + this.x; } protected static sf() { return super.sf() + this.sx; } } // Derived class making protected members public class C3 extends C2 { x: number; static sx: number; f() { return super.f(); } static sf() { return super.sf(); } } var c1: C1; var c2: C2; var c3: C3; // All of these should be errors c1.x; ~~~~ !!! error TS2445: Property 'x' is protected and only accessible within class 'C1' and its subclasses. c1.f(); ~~~~ !!! error TS2445: Property 'f' is protected and only accessible within class 'C1' and its subclasses. C1.sx; ~~~~~ !!! error TS2445: Property 'sx' is protected and only accessible within class 'C1' and its subclasses. C1.sf(); ~~~~~ !!! error TS2445: Property 'sf' is protected and only accessible within class 'C1' and its subclasses. // All of these should be errors c2.x; ~~~~ !!! error TS2445: Property 'x' is protected and only accessible within class 'C1' and its subclasses. c2.f(); ~~~~ !!! error TS2445: Property 'f' is protected and only accessible within class 'C2' and its subclasses. C2.sx; ~~~~~ !!! error TS2445: Property 'sx' is protected and only accessible within class 'C1' and its subclasses. C2.sf(); ~~~~~ !!! error TS2445: Property 'sf' is protected and only accessible within class 'C2' and its subclasses. // All of these should be ok c3.x; c3.f(); C3.sx; C3.sf(); class A { protected x; } class B extends A { y; } class C extends A { z; static foo(a: A, b: B, c: C, d: D, e: E) { a.x = 1; // Error, access must be through C or type derived from C ~~~ !!! error TS2446: Property 'x' is protected and only accessible through an instance of class 'C'. b.x = 1; // Error, access must be through C or type derived from C ~~~ !!! error TS2446: Property 'x' is protected and only accessible through an instance of class 'C'. c.x = 1; d.x = 1; e.x = 1; } } class D extends C { d; } interface E extends C { e; } class CC { // Error, constructor cannot be protected protected constructor() { ~~~~~~~~~ !!! error TS1089: 'protected' modifier cannot appear on a constructor declaration. } } class A1 { protected x; } class B1 { x; } var a1: A1; var b1: B1; a1 = b1; // Error, B1 doesn't derive from A1 ~~ !!! error TS2322: Type 'B1' is not assignable to type 'A1'. !!! error TS2322: Property 'x' is protected but type 'B1' is not a class derived from 'A1'. b1 = a1; // Error, x is protected in A1 but public in B1 ~~ !!! error TS2322: Type 'A1' is not assignable to type 'B1'. !!! error TS2322: Property 'x' is protected in type 'A1' but public in type 'B1'. class A2 { protected x; } class B2 extends A2 { x; } class A3 { x; } // Error x is protected in B3 but public in A3 class B3 extends A3 { ~~ !!! error TS2415: Class 'B3' incorrectly extends base class 'A3'. !!! error TS2415: Property 'x' is protected in type 'B3' but public in type 'A3'. protected x; }