Rule 8.12
Chapter 8, Functions and entry points Test
A private name #x must be emitted without its #: a field as the struct member x, a method as Owner_x, an accessor as Owner_get_x and Owner_set_x, a static field as Owner_x.
It may be named only inside the body of the class that declares it, which is TypeScript’s rule and which the front end enforces because it does not run the checker; a public name never reaches a private member, and an object literal, a spread and a destructuring pattern do not reach one either.
Two members of one class chain that would share an emitted name (#x beside x, a static field beside a function of its name, or #x declared by a class and again by one that extends it) must be refused.
The rule text and the parts under it are the compiler's own English, as the design document writes them.
Rationale
WGSL and GLSL ES 3.00 have no private member and no # in a name, so privacy is a property of the source that the front end keeps, and it can keep it only while no emitted name stands for two members.
Derives from
ECMAScript private names as TypeScript spells them (TS18013 for an access from outside, TS2741 for a literal of such a class); Rule 3.2; 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 an access from outside the class, for two members on one function name and for a static field and a function on one module name (The static field "Base.#n" and the function "Base.n" would both be "Base_n": a private name is emitted without its "#". Rename one of them.), TS8010 STRUCT_FIELD for two members on one struct member and for an object literal of a class with a private field, pinned by src/compiler/ts/class-syntax.test.ts; examples/class-syntax.shade.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:734(the design document)reqs/rules/RULE-0812.md(its traceability item)