Fluent Interfaces mit Typen
Verketten Sie Methoden und verfolgen Sie dabei den angesammelten Zustand in den Typen.
Fluent Interfaces mit Typen ist eine kostenlose TypeScript Academy-Lektion auf CoddyKit. Dies ist Lektion 2 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.
Festgelegte Werte nachverfolgen
Ein einfacher Builder lässt zu, dass Sie jederzeit build() aufrufen, selbst wenn erforderliche Felder fehlen. Wir können das verbessern, indem wir den angesammelten Zustand im Typsystem nachverfolgen und dafür einen generischen Typparameter verwenden.
Ein Zustands-Typparameter
Wir geben dem Builder ein generisches S, das festhält, welche Schlüssel bisher angegeben wurden. Bei jedem Aufruf einer Methode erweitern wir S um einen neuen Schlüssel.
class Builder<S> {
// S is a record of keys set so far, e.g. {} or { url: string }
private data: Record<string, unknown> = {};
}Jede Methode fügt einen Schlüssel hinzu
Ein Setter gibt einen neuen typisierten Builder zurück, dessen S den soeben hinzugefügten Schlüssel enthält. Zur Laufzeit wird der Wert gespeichert; der Typ wird entsprechend erweitert.
set<K extends string, V>(key: K, value: V): Builder<S & Record<K, V>> {
this.data[key] = value;
return this as unknown as Builder<S & Record<K, V>>;
}Der Schnittmengen-Trick
Der Ausdruck S & Record<K, V> bildet die Schnittmenge aus dem vorherigen Zustand und dem neuen Schlüssel. Nach zwei Aufrufen kennt der Typ beide Schlüssel präzise.
type Empty = {};
type AfterUrl = Empty & Record<"url", string>;
type AfterBoth = AfterUrl & Record<"method", string>;
// AfterBoth = { url: string; method: string }Ein konkreter Fluent-Builder
Hier führt ein Request-Builder seine angesammelte Struktur durch jeden Aufruf weiter. Der Compiler weiß jederzeit genau, welche Felder vorhanden sind.
class Req<S> {
private d: Record<string, unknown> = {};
url(u: string): Req<S & { url: string }> {
this.d.url = u; return this as any;
}
method(m: string): Req<S & { method: string }> {
this.d.method = m; return this as any;
}
}Der Typ wächst beim Verketten
Jeder Aufruf in der Kette erzeugt einen spezifischeren Builder-Typ. Wenn Sie im Editor mit der Maus über das Ergebnis fahren, wird der angesammelte Zustand angezeigt.
const partial = new Req<{}>().url("/x");
// type: Req<{ url: string }>
const full = partial.method("POST");
// type: Req<{ url: string; method: string }>Warum den Zustand überhaupt verfolgen?
Sobald der Typ die Menge der angegebenen Schlüssel enthält, können wir build() später so einschränken, dass der Aufruf nur kompiliert wird, wenn die erforderlichen Schlüssel vorhanden sind. Der Zustandsparameter bildet die Grundlage für diese Garantie.
Die angesammelte Struktur auslesen
Sie können die angesammelte Struktur extrahieren, um sie zu untersuchen. Dadurch wird bestätigt, dass der Typ des Builders genau die Konfiguration widerspiegelt.
type StateOf<T> = T extends Req<infer S> ? S : never;
type S1 = StateOf<Req<{ url: string }>>; // { url: string }Die Laufzeit bleibt einfach
Die gesamte Raffinesse steckt in den Typen. Zur Laufzeit speichert jeder Setter lediglich einen Wert in einem Objekt. Die Casts (as any) schlagen eine Brücke zwischen dem Laufzeitobjekt und dem umfassenderen Typ zur Kompilierzeit.
const r = new Req<{}>().url("/users").method("GET");
console.log("configured url and method");Generischer Zustand als Protokoll
Betrachten Sie S als ein Protokoll darüber, was gesetzt wurde. Methoden fügen Einträge hinzu; der Build-Schritt kann das Protokoll später auslesen, um zu entscheiden, ob die Erstellung zulässig ist.
Abwägungen
Die Nachverfolgung des Zustands auf Typebene liefert präzise IDE-Rückmeldungen und verhindert unvollständige Builds, kostet aber einige Casts und fortgeschrittenere Generics. Für APIs, die von vielen Personen verwendet werden, lohnt sich das.
Kurztest
Kurzer Test zu dieser Lektion.
Zusammenfassung
Ein Fluent-Builder mit Typisierung führt einen generischen Zustandsparameter S mit. Jeder Setter bildet die Schnittmenge von S mit dem neuen Schlüssel (S & Record<K, V>) und gibt einen spezifischeren Builder zurück. Dadurch erhält der Compiler ein präzises Protokoll der konfigurierten Felder.
Häufig gestellte Fragen
Ist die Lektion „Fluent Interfaces mit Typen“ kostenlos?
Ja — der vollständige Text von „Fluent Interfaces mit Typen“ 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 „Fluent Interfaces mit Typen“?
Verketten Sie Methoden und verfolgen Sie dabei den angesammelten Zustand in den Typen. 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 2 von 4.
Wie lange dauert die Lektion „Fluent Interfaces mit Typen“?
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