Modellare i tipi di dominio in TypeScript con unioni discriminate
Riprogetta i tipi di dominio TypeScript perché gli stati impossibili non compilino: unioni discriminate, tipi brand per gli ID, switch esaustivo e validazione ai confini del sistema. Pensato per ChatGPT, Claude, Gemini e Microsoft Copilot. Include 3 variabili personalizzabili e puoi copiarlo gratuitamente con un clic.
Avanzato · Codice · In attesa di revisione editoriale
Prompt
Agisci come esperto di TypeScript e di design guidato dai tipi, che privilegia la chiarezza rispetto ai trucchi.
Contesto:
- Dominio: {{dominio}}
- Tipi attuali (se presenti): {{tipi_attuali}}
- Dove si usano: {{uso}}
Se non è chiaro quali transizioni tra stati siano valide o quali campi esistano in ogni stato, chiedimelo prima di progettare.
Consegna:
1. Una diagnosi dei tipi attuali: quali combinazioni impossibili consentono (ad esempio un ordine «spedito» senza data di spedizione) e quali bug possono causare.
2. Il nuovo modello: unioni discriminate da un campo letterale, campi presenti solo nello stato a cui appartengono, `readonly` dove ha senso e tipi brand per gli identificatori da non confondere.
3. Funzioni di transizione tipizzate che accettino solo lo stato di partenza valido.
4. Uno `switch` esaustivo con controllo `never` e un esempio dell'errore di compilazione che compare aggiungendo un nuovo stato non gestito.
5. Validazione ai confini del sistema (API, form, storage) con uno schema da cui derivare il tipo, così tipo e validazione non divergono.
6. Test sui tipi con `@ts-expect-error` o `expectTypeOf` che dimostrino che gli stati impossibili non compilano.
7. Quando questo modello è eccessivo e basterebbe qualcosa di più semplice.
Vincoli:
- Preferisci unioni di letterali agli `enum`, a meno che tu non spieghi perché qui convenga un enum.
- Niente tipi condizionali o generici complessi se non portano un vantaggio chiaro; il codice deve essere leggibile da uno sviluppatore intermedio.
- Non inventare regole di business: segna quelle da confermare con [DA COMPLETARE].
Formato: diagnosi, blocchi di codice con nome del file e una tabella di stati e transizioni.Come usarlo
- Descrivi gli stati reali della tua entità e quali dati ha ciascuno. 2. Incolla i tipi attuali se esistono. 3. Sostituisci i tipi gradualmente e lascia che il compilatore ti indichi gli usi da adattare.
Esempio d'uso
Dominio: ordini di un negozio online con stati in attesa, pagato, spedito, consegnato e annullato · Tipi attuali: interfaccia Ordine con tutti i campi opzionali · Uso: stato dell’interfaccia e risposte API.
Esempio di risultato
Diagnosi
stato: string con campi opzionali permette combinazioni impossibili: un ordine 'spedito' senza codiceTracking o uno 'annullato' con pagatoIl e senza motivo. Ogni componente finisce per riempirsi di ?..
ordine.ts
export type OrdineId = string & { readonly __brand: 'OrdineId' };
type Base = { readonly id: OrdineId };
export type Ordine =
| (Base & { stato: 'in_attesa' })
| (Base & { stato: 'pagato'; pagatoIl: Date })
| (Base & { stato: 'spedito'; pagatoIl: Date; codiceTracking: string })
| (Base & { stato: 'consegnato'; pagatoIl: Date; codiceTracking: string })
| (Base & { stato: 'annullato'; motivoAnnullamento: string });
type InStato<S extends Ordine['stato']> = Extract<Ordine, { stato: S }>;
export function spedisci(ordine: InStato<'pagato'>, codiceTracking: string): InStato<'spedito'> {
return { ...ordine, stato: 'spedito', codiceTracking };
}
export function etichetta(ordine: Ordine): string {
switch (ordine.stato) {
case 'in_attesa': return 'In attesa di pagamento';
case 'pagato': return 'Pagato';
case 'spedito': return `Spedito (${ordine.codiceTracking})`;
case 'consegnato': return 'Consegnato';
case 'annullato': return `Annullato: ${ordine.motivoAnnullamento}`;
default: {
const esaustivo: never = ordine;
return esaustivo;
}
}
}
Se domani aggiungi 'reso' e non lo gestisci, la riga con never smette di compilare. Da confermare: un ordine già pagato può essere annullato? [DA COMPLETARE]…
Dati chiave
- Categoria
- Programmazione e sviluppo · TypeScript
- Tipo di output
- Codice
- Livello
- Avanzato
- Pensato per
- ChatGPT, Claude, Gemini e Microsoft Copilot
- Verificato in
- In attesa di verifica editoriale
- Variabili
- Dominio, Tipi attuali e Dove si usano
- Lingua
- Italiano
- Prezzo
- Gratuito, senza registrazione
- Aggiornato
- 07/11/2026
Domande frequenti
Cos’è un’unione discriminata?
Un tipo composto da più varianti che condividono un campo letterale, come stato: «pagato» o «spedito». TypeScript usa quel campo per sapere quali altri campi esistono in ogni variante.
A cosa servono i tipi brand per gli ID?
Fanno sì che il compilatore rifiuti un IdCliente dove serve un IdOrdine, anche se sono entrambi stringhe. Evitano bug silenziosi difficili da notare in code review.
A cosa serve questo prompt?
Riprogetta i tipi di dominio TypeScript perché gli stati impossibili non compilino: unioni discriminate, tipi brand per gli ID, switch esaustivo e validazione ai confini del sistema.
Con quali strumenti di IA funziona?
È pensato per ChatGPT, Claude, Gemini e Microsoft Copilot. Non lo abbiamo ancora verificato in questi strumenti, quindi i risultati possono variare da uno all'altro.
Come personalizzo il prompt?
Clicca su «Personalizza» e compila le variabili (Dominio, Tipi attuali e Dove si usano). Il testo si aggiorna all'istante e poi puoi copiarlo con un clic. I valori vengono salvati solo nel tuo browser.
Serve esperienza per usarlo?
È di livello avanzato: è pensato per persone con esperienza nell'argomento, in grado di valutare e regolare il risultato.
Questo prompt è gratuito?
Sì. Tutti i prompt di HomeCasa Prompts sono gratuiti, senza registrazione né abbonamento. Puoi usarli anche in progetti professionali.
Posso fidarmi dell'output dell'IA?
Consideralo una bozza di alta qualità: verifica sempre dati, cifre e affermazioni importanti prima di pubblicare o prendere decisioni.