Erforderliche Schritte erzwingen
Verhindern Sie build(), bevor alle erforderlichen Felder gesetzt sind.
Erforderliche Schritte erzwingen ist eine kostenlose TypeScript Academy-Lektion auf CoddyKit. Dies ist Lektion 3 von 4. Du kannst die komplette Lektion unten kostenlos lesen – dann übst du sie direkt im Browser mit einem integrierten Code-Editor und einem KI-Tutor rund um die Uhr. Sie ist Teil des TypeScript Academy-Lernpfads, und dein Fortschritt wird über Web und CoddyKit-App synchronisiert. Der TypeScript Academy-Kurs umfasst insgesamt 4 Lektionen.
Vorzeitiges build() verhindern
Jetzt verwenden wir den angesammelten Zustand, um den Aufruf von build() zu verhindern, bis die erforderlichen Felder gesetzt sind. Das Typsystem und nicht eine Prüfung zur Laufzeit blockiert eine unvollständige Erstellung.
Die endgültige Struktur definieren
Beginnen Sie mit der Deklaration des vollständigen Objekts und der Angabe, welche Schlüssel erforderlich sind. Der Builder lässt build() nur zu, wenn der Zustand alle diese Schlüssel enthält.
interface Config {
url: string; // required
method: string; // required
timeout?: number; // optional
}
type Required = { url: string; method: string };Bedingte build-Signatur
Wir stellen build nur zur Verfügung, wenn der angesammelte Zustand S die erforderlichen Schlüssel erweitert. Eine bedingte Typdefinition liefert entweder die echte Methode oder eine nicht verwendbare Variante.
class Builder<S> {
build(this: Builder<Required>): Config {
return this.d as Config;
}
private d: Record<string, unknown> = {};
}Den this-Parameter verwenden
Der this: Builder<Required>-Parameter schränkt ein, welche Builder-Instanzen build aufrufen dürfen. Wenn S Required nicht erfüllt, führt der Aufruf zu einem Typfehler.
// Only a Builder whose S includes url and method
// can legally invoke build().Setter mit dem Zustand verknüpfen
Jeder Setter erweitert S wie zuvor. Nachdem beide erforderlichen Setter ausgeführt wurden, erfüllt S endlich Required, und build kann aufgerufen werden.
class Builder<S> {
private d: Record<string, unknown> = {};
url(u: string): Builder<S & { url: string }> { this.d.url = u; return this as any; }
method(m: string): Builder<S & { method: string }> { this.d.method = m; return this as any; }
build(this: Builder<{ url: string; method: string }>): Config { return this.d as Config; }
}Der Erfolgsfall wird kompiliert
Wenn beide erforderlichen Schritte vorhanden sind, besteht die Kette die Typprüfung und wird ausgeführt. Der Compiler ist überzeugt, dass S jeden erforderlichen Schlüssel enthält.
const cfg = new Builder<{}>().url("/x").method("GET").build();
console.log(cfg.url, cfg.method);Der Fehlerfall schlägt fehl
Lassen Sie einen erforderlichen Schritt aus, besteht build() die Typprüfung nicht mehr, weil S des Builders Required nicht erweitert. Der Fehler wird zur Kompilierzeit erkannt.
// const bad = new Builder<{}>().url("/x").build();
// Error: 'build' can only be called when method is set too.Warum das besser ist als Prüfungen zur Laufzeit
Eine Prüfung zur Laufzeit wie if (!this.url) throw schlägt erst fehl, wenn der Code ausgeführt wird. Der this-Parameter-Ansatz schlägt bereits während der Typprüfung fehl, sodass unvollständige Builds gar nicht erst ausgeliefert werden.
Optionale Felder bleiben optional
Optionale Schritte wie timeout sind nie Teil von Required, daher entscheiden sie nicht darüber, ob build() zulässig ist. Sie können sie beliebig einbeziehen oder überspringen.
const ok = new Builder<{}>().method("PUT").url("/y").build();
console.log("order of required steps does not matter");Auf viele Anforderungen skalieren
Fügen Sie der Struktur Required und dem this-Parameter weitere erforderliche Schlüssel hinzu; der Compiler setzt dann alle durch. Das Muster lässt sich auf beliebig viele erforderliche Schritte skalieren.
Einschränkungen
Die Garantie hängt davon ab, dass S ehrlich durch jeden Setter weitergereicht wird und die Typisierung mit dem this-Parameter verwendet wird. Casts müssen auf die Setter beschränkt bleiben, damit Aufrufer vollständig typsicher bleiben.
Kurztest
Kurzer Test zu dieser Lektion.
Zusammenfassung
Um erforderliche Schritte durchzusetzen, typisieren Sie build mit einem this: Builder<Required>-Parameter. Die Methode besteht die Typprüfung erst, sobald der angesammelte Zustand S jeden erforderlichen Schlüssel enthält. Dadurch wird eine unvollständige Erstellung zu einem Kompilierfehler.
Häufig gestellte Fragen
Ist die Lektion „Erforderliche Schritte erzwingen“ kostenlos?
Ja — der vollständige Text von „Erforderliche Schritte erzwingen“ ist hier im Web kostenlos zu lesen. Um sie interaktiv zu üben (integrierter Code-Editor und 24/7 KI-Tutor) und den Rest des TypeScript Academy-Kurses freizuschalten, upgrade auf CoddyKit PRO. Der TypeScript Academy-Kurs umfasst insgesamt 4 Lektionen.
Was lerne ich in „Erforderliche Schritte erzwingen“?
Verhindern Sie build(), bevor alle erforderlichen Felder gesetzt sind. Du übst TypeScript Academy mit praktischem Code, den du direkt im Browser ausführst, und ein 24/7 KI-Tutor beantwortet deine Fragen während du die Lektion bearbeitest.
Brauche ich Erfahrung, um TypeScript Academy zu starten?
Keine Vorkenntnisse erforderlich. TypeScript Academy auf CoddyKit ist für Anfänger bis fortgeschrittene Lernende strukturiert, sodass du hier starten oder von Anfang an beginnen und in deinem eigenen Tempo voranschreiten kannst. Dies ist Lektion 3 von 4.
Wie lange dauert die Lektion „Erforderliche Schritte erzwingen“?
Die meisten CoddyKit-Lektionen dauern etwa 5–10 Minuten. Jede ist kompakt und interaktiv, sodass du stetig Fortschritte machst und genau dort weitermachst, wo du aufgehört hast – im Web und in der App.
Kann ich in dieser TypeScript Academy-Lektion Code schreiben und ausführen?
Ja. Jede TypeScript Academy-Lektion enthält einen integrierten Code-Editor, sodass du echten Code direkt in deinem Browser schreibst und ausführst und sofort KI-Feedback erhältst — ohne lokale Einrichtung erforderlich.
Alle Lektionen in diesem Kurs
- Grundlagen des Builder-Patterns
- Fluent Interfaces mit Typen
- Erforderliche Schritte erzwingen
- Unveränderliche Builder