microsoft / microsoft/TypeScript

emit an error when using #private fields in their "temporal dead zone"

Offen
#56,810 3 Kommentare 0 Reaktionen 0 zugewiesene Personen Auf GitHub ansehen

Dieses Issue hat noch niemand übernommen.

Awaiting More Feedback Suggestion
Vorherrschende Sprache
Go
Sterne
111k
Forks
14.4k
Ø Merge
1 T. 19 Std.
Gemergte PRs (30 T.)
117

Beschreibung

🔍 Search Terms

error for private member accessed before ready

✅ Viability Checklist
⭐ Suggestion

This produces a runtime error when you run it:

abstract class Base {
  constructor() {
	this.createStuff()
  }

	abstract createStuff(): void
}

class Sub extends Base {
	#makeSomething() {
		console.log('make stuff')
	}

	createStuff() {
		this.#makeSomething()
	}
}

// TypeError: Cannot read private member from an object whose class did
// not declare it (JavaScript points finger at you while laughing)
new Sub().createStuff()

playground

📃 Motivating Example

It has happened to me too many times due to subclass code running early before initialization of private fields.

Unfortunately the simple solution is to avoid class fields for this case (use properties-defined-in-constructor, or getters).

💻 Use Cases

Sometimes we want a constructor to make stuff generically for subclasses, but then subclasses should override or implement some methods to replace certain parts.

I believe there is enough static info that it would be possible to check for this case and emit a compile error.

Similarly it would also be possible to enforce non-private fields to be | undefined when used early in a location that is known to be called before initialization (f.e. in a superclass constructor).

Beitragsleitfaden

Beitragsleitfaden öffnen

Erste Schritte

  1. Lies das ganze Issue und danach den Beitragsleitfaden des Projekts.
  2. Schreib ins Issue, dass du es übernimmst — das erspart doppelte Arbeit.
  3. Forke das Repository und arbeite in einem Branch.
  4. Öffne einen Pull Request, der die Issue-Nummer nennt.

Rechercherichtung

Reproduziere das Unterklassenbeispiel im verlinkten TypeScript Playground und vergleiche seinen Laufzeitfehler mit der angeforderten Compile-Time-Diagnose. Bestimme den vorgesehenen Umfang für den Zugriff des Superklassenkonstruktors auf private und nicht-private Felder, und definiere anschließend Tests, die bestätigen, dass die relevanten Fälle einer frühzeitigen Verwendung abgelehnt werden, ohne das ausgegebene JavaScript zu ändern.

Vom Indexierungsmodell aus dem Issue-Text verfasst.

Bewertung

Tech-Stack
javascript, typescript
Bereich
compilers
Issue-Typ
Feature
Schwierigkeit
5/5
Geschätzter Aufwand
Über eine Woche
Aktivitätsstatus
Veraltet
Klarheit
Größtenteils klar
Anfängerfreundlichkeit
35/100

Neue Issues direkt in Ihr Postfach

Eine kurze Übersicht über anfängerfreundliche GitHub-Issues.