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:
See also
Source
The rule at commit 26de7be8:
docs/language-design.md:760(the design document)reqs/rules/RULE-0815.md(its traceability item)