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

  1. 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.

Prompts similaires