This page is also available in English.

Continue in English

Token

TinyDI identifica i servizi con dei token, non con stringhe o classi. Un token viene creato una volta sola, e usato sia per registrare un servizio sia per risolverlo.

Creare un token

ts
interface IMailService {
  send(to: string, body: string): Promise<void>;
}
 
const MailServiceToken = createToken<IMailService>('MailService');

createToken<T>(description) restituisce un Token<T>. La stringa description è un'etichetta leggibile usata solo nei messaggi di errore — non deve essere univoca.

Perché un symbol, non una stringa

Ogni token racchiude un symbol JavaScript univoco come sua vera identità. Due token creati con la stessa description restano comunque due registrazioni distinte:

ts
const a = createToken<string>('Name');
const b = createToken<string>('Name');
 
a.symbol !== b.symbol; // true — token distinti, nessuna collisione

Questo elimina un'intera categoria di bug che i container basati su stringhe devono gestire con attenzione: due moduli non correlati che scelgono per caso lo stesso identificatore stringa per servizi diversi.

Inferenza di tipo senza generics

Il tipo del servizio T è trasportato dal token stesso, tramite una proprietà opzionale __type?: T che esiste solo a livello di tipo — non viene mai assegnata né letta a runtime. Grazie a questo, container.resolve(token) inferisce automaticamente il tipo di ritorno esatto:

ts
// Nessun generic esplicito necessario — inferito come IMailService.
const mailService = container.resolve(MailServiceToken);

Tipizza il tuo token con un'interfaccia

Parametrizza sempre createToken con un'interfaccia (IMailService), non con una classe concreta. Il codice che dipende da MailServiceToken non dovrebbe mai aver bisogno di importare l'implementazione concreta che c'è dietro.

per navigare per selezionare Esc per chiudere