0Pricing
TypeScript Academy · Lezione

Metadati dei decorator

Colleghi e legga i metadati con la metadata API.

Metadati dei decorator è una lezione TypeScript Academy gratuita su CoddyKit. Questa è la lezione 2 di 4. Puoi leggere la lezione completa qui gratuitamente — poi esercitati direttamente nel browser con un editor di codice integrato e un tutor IA disponibile 24/7. Fa parte del percorso di apprendimento TypeScript Academy, e i tuoi progressi si sincronizzano tra il web e l'app CoddyKit. Il corso TypeScript Academy include 4 lezioni in totale.

L'API dei metadati dei decorator

I decorator standardizzati includono un canale integrato per i metadati. L'oggetto context espone un oggetto metadata su cui è possibile scrivere, e in seguito la classe lo conserva nella chiave nota Symbol.metadata.

context.metadata

Ogni contesto del decoratore condivide un unico oggetto metadata per la classe in fase di definizione. I decoratori vi associano dati, che diventano i metadati della classe.

function tag(label: string) {
  return function (value: any, context: DecoratorContext) {
    context.metadata[context.name] = label;
  };
}

Lettura tramite Symbol.metadata

Dopo la definizione della classe, i metadati raccolti sono disponibili in 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" }

Perché un oggetto condiviso

Poiché tutti i decoratori di una classe scrivono nello stesso oggetto metadata, è possibile raccogliere le informazioni provenienti da molti decoratori in un unico record coerente che descrive la classe.

Memorizzazione di metadati strutturati

I valori dei metadati possono avere qualsiasi struttura. Un modello comune consiste nel mantenere un record annidato indicizzato per nome del membro.

function column(type: string) {
  return function (value: any, context: ClassFieldDecoratorContext) {
    const md = context.metadata as any;
    md.columns ??= {};
    md.columns[context.name] = { type };
  };
}

Metadati a livello di classe

Un decoratore di classe può anche scrivere metadati, ad esempio il nome di una tabella che completa le informazioni sulle colonne dei singoli campi.

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 = "";
}

Ereditarietà dei metadati

Gli oggetti dei metadati sono collegati lungo la catena dei prototipi: l'oggetto dei metadati di una sottoclasse ha come prototipo i metadati della classe padre, quindi le voci ereditate sono visibili se non vengono sovrascritte.

Polyfill di Symbol.metadata

Symbol.metadata è un simbolo noto. Negli ambienti che non lo supportano, si assegna un polyfill affinché il runtime possa collegare l'oggetto raccolto.

(Symbol as any).metadata ??= Symbol.for("Symbol.metadata");

Metadati senza reflect-metadata

Questa API fa parte della proposta dei decoratori stessa, quindi non richiede la libreria separata reflect-metadata. La libreria resta rilevante solo per la precedente emissione sperimentale dei tipi in fase di progettazione (nella lezione successiva).

Un pratico helper di lettura

Un piccolo accessor centralizza la lettura dei metadati da qualsiasi classe e restituisce un oggetto vuoto quando non esistono metadati.

function getMeta(cls: any): Record<string, any> {
  return (cls[Symbol.metadata] as Record<string, any>) ?? {};
}

Perché è importante

I metadati trasformano i decoratori da semplici wrapper comportamentali a una descrizione dichiarativa delle proprie classi. I framework leggono questa descrizione per creare ORM, validator e router senza ricorrere a trucchi di reflection a runtime.

Verifica rapida

Confermi di aver compreso l'API dei metadati.

Riepilogo

L'API dei metadati dei decoratori fornisce a ogni decoratore un oggetto context.metadata condiviso, esposto sulla classe tramite Symbol.metadata. I decoratori raccolgono metadati strutturati ed ereditabili senza librerie esterne, rendendo possibili descrizioni delle classi dichiarative e adatte ai framework.

Domande Frequenti

La lezione «Metadati dei decorator» è gratuita?

Sì — il testo completo di «Metadati dei decorator» è gratuito qui sul web. Per esercitarvi in modo interattivo (un editor di codice integrato e un tutor IA 24/7) e sbloccare il resto del corso TypeScript Academy, passa a CoddyKit PRO. Il corso TypeScript Academy include 4 lezioni in totale.

Cosa imparerò in «Metadati dei decorator»?

Colleghi e legga i metadati con la metadata API. Eserciti TypeScript Academy con codice pratico che esegui direttamente nel browser, e un tutor IA 24/7 risponde alle tue domande mentre lavori sulla lezione.

Ho bisogno di esperienza per iniziare TypeScript Academy?

Non è richiesta alcuna esperienza precedente. TypeScript Academy su CoddyKit è strutturato per principianti e studenti avanzati, quindi puoi iniziare da qui o dall'inizio e procedere al tuo ritmo. Questa è la lezione 2 di 4.

Quanto tempo richiede la lezione «Metadati dei decorator»?

La maggior parte delle lezioni CoddyKit richiede circa 5–10 minuti. Ogni lezione è breve e interattiva, quindi fai progressi costanti e riprendi esattamente da dove hai lasciato su web e app.

Posso scrivere ed eseguire codice in questa lezione TypeScript Academy?

Sì. Ogni lezione TypeScript Academy include un editor di codice integrato, quindi scrivi ed esegui codice reale direttamente nel tuo browser e ricevi feedback istantaneo dall'IA — nessuna configurazione locale necessaria.

Tutte le lezioni di questo corso

  1. Spiegazione dei decorator di Stage 3
  2. Metadati dei decorator
  3. reflect-metadata e design type
  4. Costruire un framework di decorator
← Torna a TypeScript Academy