reflect-metadata und Design-Typen
Erfassen Sie Parameter- und Eigenschaftstypen zur Laufzeit.
reflect-metadata und Design-Typen 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.
reflect-metadata und Design-Typen
Bevor standardisierte Metadaten verfügbar waren, konnte TypeScript mithilfe der Bibliothek reflect-metadata und der Compileroption emitDecoratorMetadata Typinformationen zur Entwurfszeit zur Laufzeit ausgeben. Diese Lektion behandelt diesen älteren, aber weiterhin weit verbreiteten Mechanismus.
Die Funktion aktivieren
Es sind zwei Dinge erforderlich: Aktivieren Sie die Compileroptionen und importieren Sie die Bibliothek einmal am Programmeinstiegspunkt.
// tsconfig.json
// {
// "compilerOptions": {
// "experimentalDecorators": true,
// "emitDecoratorMetadata": true
// }
// }
import "reflect-metadata";Was ausgegeben wird
Mit emitDecoratorMetadata gibt der Compiler für dekorierte Member drei Schlüssel aus: design:type, design:paramtypes und design:returntype. Die Werte sind die Konstruktorfunktionen, zum Beispiel String und Number.
design:type lesen
Bei einer dekorierten Eigenschaft gibt Reflect.getMetadata("design:type", target, key) den Konstruktor des Eigenschaftstyps zurück.
import "reflect-metadata";
function track(target: any, key: string) {
const t = Reflect.getMetadata("design:type", target, key);
console.log(key, "->", t.name); // e.g. "name -> String"
}
class Person {
@track name!: string;
@track age!: number;
}design:paramtypes lesen
Bei einem Konstruktor oder einer Methode ist design:paramtypes ein Array der Konstruktoren der Parametertypen und bildet die Grundlage für Dependency Injection.
function injectable(target: any) {
const params = Reflect.getMetadata("design:paramtypes", target);
console.log(params.map((p: any) => p.name)); // ["Database", "Logger"]
}
@injectable
class Service {
constructor(private db: Database, private log: Logger) {}
}Einschränkungen ausgegebener Typen
Nur einfache, zur Laufzeit darstellbare Typen bleiben erhalten. Interfaces, Unions und Generics werden zu Object, weil sie keinen Laufzeitkonstruktor besitzen. Design-Typen sind Annäherungen und nicht der vollständige TS-Typ.
Benutzerdefinierte Metadaten mit Reflect
Sie können mit Reflect.defineMetadata auch eigene Metadatenschlüssel definieren, unabhängig von den Design-Typen.
import "reflect-metadata";
function required(target: any, key: string) {
Reflect.defineMetadata("required", true, target, key);
}
function isRequired(target: any, key: string) {
return Reflect.getMetadata("required", target, key) === true;
}Einsatzbereiche
Dieser Mechanismus bildet die Grundlage vieler etablierter Frameworks (NestJS, TypeORM, class-validator). Sie lesen design:type und design:paramtypes, um Abhängigkeiten zu verbinden und Werte zu validieren, ohne dass Sie die Typen erneut angeben müssen.
reflect-metadata vs. Standardmetadaten
Die neue API Symbol.metadata ist Bestandteil der Sprache und gibt keine Design-Typen aus. reflect-metadata stellt einzigartig Typinformationen bereit, ist aber an den experimentellen Decorator-Modus gebunden. Entscheiden Sie sich pro Projekt für ein Modell.
Die Importreihenfolge ist wichtig
import "reflect-metadata" muss einmal und vor der Auswertung jeder dekorierten Klasse ausgeführt werden, da es das globale Reflect-Objekt um die Metadatenfunktionen erweitert. Importieren Sie es ganz oben in Ihrer Einstiegsdatei.
Warum das wichtig ist
Durch die Ausgabe von Design-Typen können Frameworks die Lücke zwischen Typen zur Compilezeit und dem Verhalten zur Laufzeit überbrücken. Das ist der entscheidende Baustein für komfortable Dependency Injection und Validierung. Wenn Sie die Grenzen kennen (keine Interfaces, keine Generics), vermeiden Sie überraschende Ergebnisse vom Typ Object.
Kurzer Test
Testen Sie Ihr Verständnis von reflect-metadata.
Zusammenfassung
Mit experimentalDecorators und emitDecoratorMetadata sowie einem früh ausgeführten import "reflect-metadata" gibt der Compiler design:type und design:paramtypes als Laufzeitkonstruktoren aus. Frameworks lesen diese für Dependency Injection und Validierung aus, wobei Interfaces, Unions und Generics zu Object verfallen.
Häufig gestellte Fragen
Ist die Lektion „reflect-metadata und Design-Typen“ kostenlos?
Ja — der vollständige Text von „reflect-metadata und Design-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 „reflect-metadata und Design-Typen“?
Erfassen Sie Parameter- und Eigenschaftstypen zur Laufzeit. 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 „reflect-metadata und Design-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
- Decorators der Stufe 3 erklärt
- Decorator-Metadaten
- reflect-metadata und Design-Typen
- Ein Decorator-Framework erstellen