Rule 8.15
On this page

Rule 8.15

Chapter 8, Functions and entry points Test

A member declared private may be named only inside the body of the class that declares it, and one declared protected only inside the bodies of that class and of the classes that extend it, on an object of the naming body’s own class or of one that extends it; a name either rule does not allow must be refused with the remedy. The declaration a name is checked against is the one the class whose body holds it sees, whichever class that body is compiled for (Rule 8.9), and a field a derived class declares again without a modifier is public, as TypeScript allows. An object literal cannot build a class with a private or protected field, and a spread and a destructuring pattern leave such a field out, as they leave out a private name (Rule 8.12).

The rule text and the parts under it are the compiler's own English, as the design document writes them.

Rationale

private and protected are TypeScript’s own access rules, and the front end does not run the checker that enforces them, so without this a program TypeScript refuses would compile; before this rule the two keywords were accepted and meant nothing.

Derives from

TypeScript’s member visibility (TS2341, TS2445, TS2446; TS2322 for a literal of such a class); Rule 8.12; surface §26.

How it is verified

Checked by a test. A test, a gate script or a CI workflow names this rule, and the traceability check fails when a file listed below stops naming it.

Where the rule says the compiler enforces it:

TS8035 CLASS_MEMBER for each refusal ("C.x" is private, so only the body of "C" may name it. Reach it through a public member of "C".; "C.p" is protected, and "D" may name it only on a "D"; this object is a "C". Reach it through a public member of "C".), TS8010 STRUCT_FIELD for an object literal of such a class, pinned by src/compiler/ts/class-syntax.test.ts.

The files that verify it at commit 26de7be8, each at the first line that names the rule:

Explained in

The sections of the surface document that explain this rule, at commit 26de7be8:

Error codes that enforce it

The diagnostic codes the rule names under Enforced by, or whose registry text names the rule:

TS8010 STRUCT_FIELD
An invalid struct field or declaration shape.
TS8035 CLASS_MEMBER
A class member shape the surface does not take, or a use of a member the class rules refuse, and a new that builds no class (Rule 8.13).

See also

Source

The rule at commit 26de7be8:

Edit this page Report a problem