WebIntelligence

Partial, Required, Readonly : Rendre les propriétés optionnelles, obligatoires ou en lecture seule

Après Pick et Omit, place à trois utilitaires qui permettent de modifier dynamiquement les contraintes des propriétés d'une interface, sans toucher à sa définition d'origine.

Publié le 9 mars 2026 • Temps de lecture : 8 min

Introduction : Pourquoi modifier les contraintes des propriétés ?

Dans notre précédent article sur Pick et Omit, nous avons vu comment créer des sous‑ensembles d'interfaces en sélectionnant ou excluant des propriétés. Aujourd'hui, nous allons explorer une autre famille d'utilitaires : ceux qui transforment les contraintes des propriétés.

Il arrive souvent qu'une même entité doive être utilisée dans des contextes différents :

  • Un formulaire de création où tous les champs sont obligatoires.
  • Un formulaire d'édition où seuls quelques champs sont modifiables et optionnels.
  • Une configuration chargée une fois pour toutes et qui ne doit plus être altérée.

Plutôt que de dupliquer vos interfaces, TypeScript met à disposition trois utilitaires génériques : Partial, Required et Readonly. Ils permettent de transformer un type existant en un nouveau type où chaque propriété devient respectivement optionnelle, obligatoire ou en lecture seule.

Prérequis

Cet article est le troisième volet de notre série sur les utilitaires TypeScript. Si vous n'avez pas lu l'article sur Pick et Omit, pas d'inquiétude : ces outils sont indépendants, mais la philosophie de composition des types reste la même.

1. Partial<Type> : Tout rendre optionnel

Partial<T> construit un type à partir de Ttoutes les propriétés deviennent optionnelles (le ? est ajouté à chacune).

Syntaxe

Exemple simple

Cas d'usage concret : formulaire d'édition

Imaginez un composant React qui permet de modifier seulement quelques champs d'un utilisateur. Avec Partial, l'état local du formulaire peut être typé précisément.

🎯 À retenir

Partial est idéal pour les mises à jour partielles, les formulaires en plusieurs étapes, ou lorsque vous voulez accumuler progressivement des données.

2. Required<Type> : Tout rendre obligatoire

Required<T> est l'opposé de Partial : il construit un type où toutes les propriétés deviennent obligatoires (le ? est retiré).

Syntaxe

Exemple simple

Cas d'usage : forcer la complétude après une phase de construction

Parfois, on construit un objet progressivement (avec des champs optionnels), puis on veut s'assurer qu'il est complet avant de l'utiliser.

💡 Required est pratique pour valider qu'un objet est complet avant une opération critique, ou pour transformer une interface optionnelle en contrat strict.

3. Readonly<Type> : Tout rendre immutable

Readonly<T> rend toutes les propriétés de T en lecture seule (readonly). Toute tentative de modification après création sera signalée par TypeScript.

Syntaxe

Exemple simple

Cas d'usage : configuration immuable, états partagés

⚠️ Readonly n'est pas profond (shallow). Les objets imbriqués ou les tableaux restent mutables si leur propre type ne les protège pas. Pour une immutabilité profonde, il faut combiner avec d'autres techniques ou utiliser Readonly récursivement.

Immutable profond avec récursivité

Combinaisons et cas avancés

Ces trois utilitaires peuvent être combinés entre eux ou avec Pick/Omit pour obtenir des types très précis.

Exemple 1 : Formulaire d'édition avec champs obligatoires et lecture seule

Exemple 2 : Configuration par défaut avec surcharge partielle

Scénarios réels

🔄 Mise à jour d'état dans Redux / Zustand

🔒 Données sensibles en lecture seule

Conclusion : Des contraintes adaptées à chaque contexte

Avec Partial, Required et Readonly, vous disposez d'outils simples mais puissants pour moduler les exigences de vos types :

  • Partial pour les mises à jour progressives ou les formulaires.
  • Required pour garantir l'exhaustivité avant une opération critique.
  • Readonly pour protéger l'intégrité des données partagées.

🚀 Prochaines étapes

Notre série sur les utilitaires TypeScript se poursuit. Voici les prochains sujets :

  1. Parameters, ConstructorParameters, ReturnType : Extraire les types des fonctions et constructeurs.
  2. Awaited : Déballer le type d'une Promise.
  3. Template Literal Types : Créer des types dynamiques à partir de chaînes.

💡 Le mot de la fin

Partial, Required et Readonly sont les couteaux suisses de la modification des contraintes. Ils vous évitent de multiplier les interfaces pour des variantes qui ne diffèrent que par l'optionalité ou la mutabilité. Utilisez‑les sans modération !

👋 Un mot de l'auteur

Merci d'avoir lu ce troisième article de la série ! J'espère que ces explications sur Partial, Required et Readonly vous aideront à écrire du code TypeScript plus expressif et plus sûr.

Si ce contenu vous a été utile, n'hésitez pas à le partager ou à me laisser un commentaire. Votre soutien est ce qui me motive à continuer.

📢 Prochain article : "Parameters, ReturnType et Awaited – Travailler avec les types de fonctions." Restez connectés !

Questions Fréquentes

Partial et Required fonctionnent-ils sur les propriétés optionnelles d'origine ?

Oui. Partial rendra optionnelles même les propriétés qui étaient obligatoires ; Required rendra obligatoires même celles qui étaient optionnelles.

Que se passe-t-il si j'applique Required à un type déjà totalement requis ?

Le type résultant est identique à l'original. Required<T> est idempotent sur les types déjà requis.

Readonly est-il récursif ?

Non, Readonly est superficiel. Seules les propriétés de premier niveau deviennent en lecture seule. Pour une immutabilité profonde, il faut définir un type récursif (comme montré plus haut).

Peut-on utiliser ces utilitaires avec des classes ?

Absolument. Ils fonctionnent sur la forme (shape) des types, donc sur les classes également.

Comment rendre seulement quelques propriétés optionnelles, sans utiliser Partial sur tout l'objet ?

Vous pouvez combiner Pick et Partial avec une intersection. Par exemple : type Modif = Partial<Pick<T, 'a' | 'b'>> & Omit<T, 'a' | 'b'>;