Metadane dekoratorów
Dołączaj i odczytuj metadane za pomocą API metadanych
Metadane dekoratorów to bezpłatna lekcja TypeScript Academy na CoddyKit. To lekcja 2 z 4. Możesz przeczytać całą lekcję poniżej za darmo — a potem ćwiczyć ją interaktywnie w przeglądarce z wbudowanym edytorem kodu i tutorem AI dostępnym 24/7. To część ścieżki edukacyjnej TypeScript Academy, a Twój postęp synchronizuje się między webem a aplikacją CoddyKit. Kurs TypeScript Academy zawiera 4 lekcji w sumie.
API metadanych dekoratorów
Standaryzowane dekoratory zawierają wbudowany kanał metadanych. Obiekt kontekstu udostępnia obiekt metadata, do którego można zapisywać dane, a klasa przechowuje je później pod dobrze znanym kluczem Symbol.metadata.
context.metadata
Każdy kontekst dekoratora współdzieli jeden obiekt metadata dla definiowanej klasy. Dekoratory dołączają do niego dane; stają się one metadanymi klasy.
function tag(label: string) {
return function (value: any, context: DecoratorContext) {
context.metadata[context.name] = label;
};
}Odczytywanie za pomocą Symbol.metadata
Po zdefiniowaniu klasy zebrane metadane są dostępne pod adresem SomeClass[Symbol.metadata].
class User {
@tag("identifier") id = 0;
@tag("display") name = "";
}
const meta = (User as any)[Symbol.metadata];
console.log(meta); // { id: "identifier", name: "display" }Dlaczego wspólny obiekt
Ponieważ wszystkie dekoratory klasy zapisują dane w tym samym obiekcie metadata, można gromadzić informacje z wielu dekoratorów w jednym spójnym rekordzie opisującym klasę.
Przechowywanie uporządkowanych metadanych
Wartości metadanych mogą mieć dowolną strukturę. Często przechowuje się zagnieżdżony rekord, którego klucze odpowiadają nazwom elementów składowych.
function column(type: string) {
return function (value: any, context: ClassFieldDecoratorContext) {
const md = context.metadata as any;
md.columns ??= {};
md.columns[context.name] = { type };
};
}Metadane na poziomie klasy
Dekorator klasy może również zapisywać metadane, na przykład nazwę tabeli uzupełniającą informacje o kolumnach poszczególnych pól.
function entity(table: string) {
return function (value: Function, context: ClassDecoratorContext) {
(context.metadata as any).table = table;
};
}
@entity("users")
class UserEntity {
@column("serial") id = 0;
@column("text") name = "";
}Dziedziczenie metadanych
Obiekty metadanych są połączone wzdłuż łańcucha prototypów: obiekt metadanych podklasy ma metadane klasy nadrzędnej jako prototyp, dlatego odziedziczone wpisy są widoczne, dopóki nie zostaną przesłonięte.
Polyfill dla Symbol.metadata
Symbol.metadata jest dobrze znanym symbolem. W środowiskach, w których go brakuje, należy przypisać polyfill, aby środowisko uruchomieniowe mogło dołączyć zebrany obiekt.
(Symbol as any).metadata ??= Symbol.for("Symbol.metadata");Metadane bez reflect-metadata
Ten interfejs API jest częścią samej propozycji dekoratorów, dlatego nie wymaga osobnej biblioteki reflect-metadata. Ta biblioteka pozostaje istotna wyłącznie w przypadku starszego eksperymentalnego emitowania typów projektowych (w następnej lekcji).
Praktyczny pomocnik odczytu
Niewielki akcesor centralizuje odczytywanie metadanych z dowolnej klasy i zwraca pusty obiekt, gdy metadane nie istnieją.
function getMeta(cls: any): Record<string, any> {
return (cls[Symbol.metadata] as Record<string, any>) ?? {};
}Dlaczego ma to znaczenie
Metadane zmieniają dekoratory z jednorazowych opakowań zachowania w deklaratywny opis klas. Frameworki odczytują ten opis, aby tworzyć ORM-y, walidatory i routery bez sztuczek opartych na refleksji w czasie działania.
Szybkie sprawdzenie
Sprawdź swoje rozumienie interfejsu API metadanych.
Podsumowanie
Interfejs API metadanych dekoratorów udostępnia każdemu dekoratorowi współdzielony obiekt context.metadata, dostępny w klasie za pośrednictwem Symbol.metadata. Dekoratory gromadzą uporządkowane, dziedziczone metadane bez użycia zewnętrznej biblioteki, umożliwiając deklaratywne opisy klas przyjazne frameworkom.
Często zadawane pytania
Czy lekcja „Metadane dekoratorów” jest bezpłatna?
Tak — pełny tekst „Metadane dekoratorów” jest dostępny za darmo tutaj w sieci. Aby ćwiczyć ją interaktywnie (wbudowany edytor kodu i tutor AI dostępny 24/7) i odblokować resztę kursu TypeScript Academy, przejdź na CoddyKit PRO. Kurs TypeScript Academy zawiera 4 lekcji w sumie.
Co nauczysz się w „Metadane dekoratorów”?
Dołączaj i odczytuj metadane za pomocą API metadanych Ćwiczysz TypeScript Academy z praktycznym kodem, który uruchamiasz bezpośrednio w przeglądarce, a tutor AI dostępny 24/7 odpowiada na Twoje pytania podczas pracy nad lekcją.
Czy potrzebuję doświadczenia, aby zacząć TypeScript Academy?
Nie wymagamy żadnego doświadczenia. TypeScript Academy w CoddyKit jest strukturyzowany dla początkujących i zaawansowanych użytkowników, więc możesz zacząć tutaj lub od początku i uczyć się w swoim tempie. To lekcja 2 z 4.
Ile czasu zajmuje lekcja „Metadane dekoratorów”?
Większość lekcji CoddyKit trwa około 5–10 minut. Każda lekcja to mały, interaktywny krok, dzięki czemu robisz systematyczne postępy i zawsze wracasz dokładnie do tego samego miejsca — na webie i w aplikacji.
Czy mogę pisać i uruchamiać kod w tej lekcji TypeScript Academy?
Tak. Każda lekcja TypeScript Academy zawiera wbudowany edytor kodu, więc piszesz i uruchamiasz prawdziwy kod bezpośrednio w przeglądarce i od razu otrzymujesz sprzężenie zwrotne od AI — bez konfiguracji na komputerze.
Wszystkie lekcje w tym kursie
- Wyjaśnienie dekoratorów etapu 3
- Metadane dekoratorów
- reflect-metadata i typy Design
- Budowanie frameworka dekoratorów