Modéliser les types métier en TypeScript avec des unions discriminées
Repensez vos types métier TypeScript pour que les états impossibles ne compilent pas : unions discriminées, types de marque pour les IDs, switch exhaustif et validation aux frontières. Conçu pour ChatGPT, Claude, Gemini et Microsoft Copilot. Il comprend 3 variables personnalisables et vous pouvez le copier gratuitement en un clic.
Avancé · Code · En attente de relecture éditoriale
Prompt
Agis comme un expert de TypeScript et de la conception guidée par les types, qui privilégie la clarté aux astuces.
Contexte :
- Domaine : {{domaine}}
- Types actuels (le cas échéant) : {{types_actuels}}
- Où ils sont utilisés : {{usage}}
S'il n'est pas clair quelles transitions entre états sont valides ou quels champs existent dans chaque état, demande-le-moi avant de concevoir.
Livrables :
1. Un diagnostic des types actuels : quelles combinaisons impossibles ils autorisent (par exemple une commande « expédiée » sans date d'expédition) et quels bugs cela peut provoquer.
2. Le nouveau modèle : unions discriminées par un champ littéral, champs présents seulement dans l'état concerné, `readonly` quand c'est pertinent et types de marque pour les identifiants à ne pas confondre.
3. Des fonctions de transition typées qui n'acceptent que l'état d'origine valide.
4. Un `switch` exhaustif avec vérification `never`, et un exemple de l'erreur de compilation qui apparaît quand on ajoute un état sans le traiter.
5. Une validation aux frontières du système (API, formulaires, stockage) avec un schéma dont le type est dérivé, pour que type et validation ne divergent pas.
6. Des tests de types avec `@ts-expect-error` ou `expectTypeOf` qui prouvent que les états impossibles ne compilent pas.
7. Les cas où ce modèle est excessif et où plus simple suffirait.
Contraintes :
- Préfère les unions de littéraux aux `enum`, sauf si tu expliques pourquoi un enum convient mieux.
- Pas de types conditionnels ni de génériques complexes sans bénéfice clair ; un développeur intermédiaire doit pouvoir lire le code.
- N'invente pas de règles métier : marque celles que je dois confirmer avec [À COMPLÉTER].
Format : diagnostic, blocs de code avec nom de fichier et tableau des états et transitions.Comment l'utiliser
- Décris les états réels de ton entité et les données de chacun. 2. Colle les types actuels s’ils existent. 3. Remplace les types progressivement et laisse le compilateur signaler les usages à adapter.
Exemple d'utilisation
Domaine : commandes d’une boutique en ligne avec les états en attente, payée, expédiée, livrée et annulée · Types actuels : une interface Commande avec tous les champs optionnels · Usage : état de l’interface et réponses d’API.
Exemple de résultat
Diagnostic
statut: string avec des champs optionnels autorise des combinaisons impossibles : une commande 'expediee' sans numeroSuivi, ou 'annulee' avec payeeLe mais sans motif. Chaque composant finit par multiplier les ?..
commande.ts
export type CommandeId = string & { readonly __marque: 'CommandeId' };
type Base = { readonly id: CommandeId };
export type Commande =
| (Base & { statut: 'en_attente' })
| (Base & { statut: 'payee'; payeeLe: Date })
| (Base & { statut: 'expediee'; payeeLe: Date; numeroSuivi: string })
| (Base & { statut: 'livree'; payeeLe: Date; numeroSuivi: string })
| (Base & { statut: 'annulee'; motifAnnulation: string });
type AuStatut<S extends Commande['statut']> = Extract<Commande, { statut: S }>;
export function expedier(commande: AuStatut<'payee'>, numeroSuivi: string): AuStatut<'expediee'> {
return { ...commande, statut: 'expediee', numeroSuivi };
}
export function libelle(commande: Commande): string {
switch (commande.statut) {
case 'en_attente': return 'En attente de paiement';
case 'payee': return 'Payée';
case 'expediee': return `Expédiée (${commande.numeroSuivi})`;
case 'livree': return 'Livrée';
case 'annulee': return `Annulée : ${commande.motifAnnulation}`;
default: {
const exhaustif: never = commande;
return exhaustif;
}
}
}
Si vous ajoutez demain 'retournee' sans la gérer, la ligne never ne compile plus. À confirmer : une commande payée peut-elle être annulée ? [À COMPLÉTER]…
Informations clés
- Catégorie
- Programmation et développement · TypeScript
- Type de résultat
- Code
- Niveau
- Avancé
- Conçu pour
- ChatGPT, Claude, Gemini et Microsoft Copilot
- Vérifié sur
- En attente de vérification éditoriale
- Variables
- Domaine, Types actuels et Où ils sont utilisés
- Langue
- Français
- Prix
- Gratuit, sans inscription
- Mis à jour
- 07/11/2026
Questions fréquentes
Qu’est-ce qu’une union discriminée ?
Un type composé de plusieurs variantes qui partagent un champ littéral, comme statut : « payée » ou « expédiée ». TypeScript s’appuie sur ce champ pour savoir quels autres champs existent dans chaque variante.
À quoi servent les types de marque pour les IDs ?
À faire refuser par le compilateur un IdClient là où un IdCommande est attendu, même si les deux sont des chaînes. Ils évitent des bugs silencieux difficiles à repérer en revue de code.
À quoi sert ce prompt ?
Repensez vos types métier TypeScript pour que les états impossibles ne compilent pas : unions discriminées, types de marque pour les IDs, switch exhaustif et validation aux frontières.
Avec quels outils d'IA fonctionne-t-il ?
Il est conçu pour ChatGPT, Claude, Gemini et Microsoft Copilot. Nous ne l'avons pas encore vérifié sur ces outils ; les résultats peuvent donc varier de l'un à l'autre.
Comment personnaliser le prompt ?
Cliquez sur « Personnaliser » et remplissez les variables (Domaine, Types actuels et Où ils sont utilisés). Le texte se met à jour instantanément et vous pouvez ensuite le copier en un clic. Les valeurs sont stockées uniquement dans votre navigateur.
Faut-il de l'expérience pour l'utiliser ?
Il est de niveau avancé : il s'adresse aux personnes expérimentées dans le domaine, capables d'évaluer et d'ajuster le résultat.
Ce prompt est-il gratuit ?
Oui. Tous les prompts de HomeCasa Prompts sont gratuits, sans inscription ni abonnement. Vous pouvez aussi les utiliser dans des projets professionnels.
Puis-je me fier au résultat de l'IA ?
Considérez-le comme un brouillon de qualité : vérifiez toujours les données, les chiffres et les affirmations importantes avant de publier ou de prendre des décisions.