0Pricing
TypeScript Academy · Lekcja

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

  1. Wyjaśnienie dekoratorów etapu 3
  2. Metadane dekoratorów
  3. reflect-metadata i typy Design
  4. Budowanie frameworka dekoratorów
← Powrót do TypeScript Academy