logo hsb.horse
← Zur Snippets-Übersicht

Snippets

Lazy-Initialisiertes Objekt

TypeScript-Pattern mit Gettern, das Werte nur beim ersten Zugriff generiert. Leichtgewichtige Lazy-Evaluation im Vergleich zum Speicher-Cache.

Veröffentlicht: Aktualisiert:

Es gibt Fälle, in denen man eine schwere Initialisierung nur beim ersten Zugriff ausführen und den generierten Wert danach wiederverwenden möchte. Dieses Pattern implementiert das einfach, ohne den Overhead eines Speicher-Caches.

Code

export interface Reusable<T> {
value: T;
}
export function reusable<T>(init: () => T): Reusable<T> {
return {
get value() {
const value = init();
Object.defineProperty(this, "value", { value });
return value;
},
};
}

Anwendungsbeispiele

Fester Zeitstempel

const timestamp = reusable(() => new Date());
// Date wird beim ersten Zugriff generiert
console.log(timestamp.value); // 2025-01-18T09:00:00.000Z
// Bei nachfolgenden Zugriffen wird derselbe Wert zurückgegeben
console.log(timestamp.value); // 2025-01-18T09:00:00.000Z

Schweres Konfigurationsladen

const config = reusable(() => {
// Datei laden, Umgebungsvariablen parsen, etc.
return loadConfigFromFile();
});
// Konfiguration wird nur bei Bedarf geladen
function processData() {
const settings = config.value; // Laden wird nur beim ersten Zugriff ausgeführt
// ...
}

Funktionsweise der Implementierung

  1. Führt die init-Funktion beim ersten Getter-Zugriff aus
  2. Überschreibt value als Dateneigenschaft mit Object.defineProperty
  3. Bei nachfolgenden Zugriffen wird der Getter nicht aufgerufen und der Wert direkt zurückgegeben

Dadurch entstehen Initialisierungskosten nur beim ersten Zugriff, danach ist die Leistung vergleichbar mit dem Zugriff auf eine normale Eigenschaft.

Vergleich mit Speicher-Cache

Unterschiede zu Speicher-Caches (wie Map):

  • Dieses Pattern ist auf einzelne Werte spezialisiert
  • Keine Schlüsselverwaltung wie bei Map erforderlich
  • Garbage Collection verhält sich wie bei normalen Objekten

Umgekehrt sollten Sie Map oder WeakMap verwenden, wenn Sie mehrere Werte cachen möchten.

Einschränkungen

Einmal initialisiert ändert sich der Wert nie. Um neu zu initialisieren, müssen Sie eine neue reusable-Instanz erstellen. Wenn die init-Funktion eine Exception wirft, wird dieselbe Exception bei nachfolgenden Zugriffen erneut geworfen.