0Pricing
TypeScript Academy · Leçon

DeepPartial et DeepReadonly

Créez des versions récursives de Partial et Readonly

DeepPartial et DeepReadonly est une leçon TypeScript Academy gratuite sur CoddyKit. Ceci est la leçon 1 sur 4. Tu peux lire la leçon complète ci-dessous gratuitement — puis la pratiquer en direct dans le navigateur avec un éditeur de code intégré et un tuteur IA 24/7. Elle fait partie du parcours d'apprentissage TypeScript Academy, et ta progression se synchronise sur le web et l'application CoddyKit. Le cours TypeScript Academy comprend 4 leçons au total.

Pourquoi des types utilitaires profonds ?

Les types intégrés Partial et Readonly ne s’appliquent qu’à un seul niveau. Pour les objets imbriqués, vous avez besoin de versions récursives.

interface Config {
  db: { host: string; port: number };
  app: { name: string };
}
type Shallow = Partial<Config>;
// Shallow.db is still required — only top level is optional

Implémentation de DeepPartial

Parcourez récursivement les propriétés d’un objet, rendez chacune d’elles facultative et appliquez récursivement DeepPartial si la valeur de la propriété est un objet.

type DeepPartial<T> = T extends object
  ? { [K in keyof T]?: DeepPartial<T[K]> }
  : T;

DeepPartial en pratique

Appliquez DeepPartial à un type de configuration imbriqué et constatez que tous les niveaux deviennent facultatifs.

type PartialConfig = DeepPartial<Config>;
// PartialConfig.db?: { host?: string; port?: number }

const c: PartialConfig = { db: { host: "localhost" } };
// No error — all other fields are optional

Implémentation de DeepReadonly

Rendez chaque propriété, à chaque profondeur, readonly en descendant récursivement dans les types d’objets imbriqués.

type DeepReadonly<T> = T extends object
  ? { readonly [K in keyof T]: DeepReadonly<T[K]> }
  : T;

DeepReadonly en pratique

Une configuration profondément gelée ne peut être modifiée à aucun niveau.

type ReadonlyConfig = DeepReadonly<Config>;
const cfg: ReadonlyConfig = { db: { host: "localhost", port: 5432 }, app: { name: "my-app" } };
// cfg.db.port = 3000; // Error: readonly

Gestion des tableaux dans les types profonds

Les tableaux nécessitent un traitement particulier : parcourez récursivement les types de leurs éléments au lieu de les traiter comme de simples objets.

type DeepPartial<T> =
  T extends (infer U)[]
    ? DeepPartial<U>[]
    : T extends object
      ? { [K in keyof T]?: DeepPartial<T[K]> }
      : T;

Gestion des types primitifs

Le cas de base de la récursion doit renvoyer les types primitifs tels quels, et non les envelopper dans un type mappé d’objet.

type DeepReadonly<T> =
  T extends string | number | boolean | null | undefined ? T
  : T extends (infer U)[] ? ReadonlyArray<DeepReadonly<U>>
  : { readonly [K in keyof T]: DeepReadonly<T[K]> };

Combinaison de DeepPartial et DeepReadonly

Vous pouvez les combiner pour créer un type profondément partiel et en lecture seule, destiné à l’application sûre de correctifs de configuration.

type SafePatch<T> = DeepReadonly<DeepPartial<T>>;

Considérations relatives aux performances

Les types récursifs appliqués à de très grands objets peuvent ralentir la vérification des types par TypeScript. Envisagez des limites de profondeur ou une évaluation différée pour les portions de code sensibles aux performances.

// For very deep schemas, consider using Zod or io-ts
// which provide runtime + compile-time deep typing

Utilisation concrète : correctifs de l’état React

DeepPartial convient parfaitement aux fonctions de correctif d’état qui n’acceptent que la partie modifiée d’un objet d’état volumineux.

function patch<T>(state: T, changes: DeepPartial<T>): T {
  return { ...state, ...changes } as T;
}

Récapitulatif : types utilitaires profonds

DeepPartial et DeepReadonly sont des types mappés récursifs qui appliquent leur modificateur à chaque niveau d’un objet imbriqué. Traitez les tableaux séparément et utilisez des cas de base pour les types primitifs.

Vérification rapide

Quel est le cas de base récursif correct pour DeepPartial ?

Ce que vous avez appris

Vous avez implémenté DeepPartial et DeepReadonly à l’aide de types mappés récursifs. Traitez les tableaux comme un cas particulier et renvoyez toujours les types primitifs inchangés dans le cas de base.

Questions Fréquemment Posées

La leçon « DeepPartial et DeepReadonly » est-elle gratuite ?

Oui — le texte complet de « DeepPartial et DeepReadonly » est gratuit à lire ici sur le web. Pour la pratiquer de manière interactive (un éditeur de code intégré et un tuteur IA 24/7) et déverrouiller le reste du cours TypeScript Academy, passe à CoddyKit PRO. Le cours TypeScript Academy comprend 4 leçons au total.

Qu'est-ce que j'apprendrai dans « DeepPartial et DeepReadonly » ?

Créez des versions récursives de Partial et Readonly Tu pratiques TypeScript Academy avec du code pratique que tu exécutes directement dans le navigateur, et un tuteur IA 24/7 répond à tes questions au fur et à mesure que tu avances dans la leçon.

Dois-je avoir de l'expérience pour commencer TypeScript Academy ?

Aucune expérience préalable n'est requise. TypeScript Academy sur CoddyKit est structuré pour les débutants jusqu'aux apprenants avancés, donc tu peux commencer ici ou depuis le début et avancer à ton rythme. Ceci est la leçon 1 sur 4.

Combien de temps prend la leçon « DeepPartial et DeepReadonly » ?

La plupart des leçons CoddyKit prennent environ 5–10 minutes. Chacune est courte et interactive, tu progresses régulièrement et tu repiques exactement où tu t'es arrêté sur le web et l'app.

Peux-tu écrire et exécuter du code dans cette leçon TypeScript Academy ?

Oui. Chaque leçon TypeScript Academy inclut un éditeur de code intégré, tu écris et exécutes du vrai code directement dans ton navigateur et tu reçois des retours IA instantanés — aucune configuration locale requise.

Toutes les leçons de ce cours

  1. DeepPartial et DeepReadonly
  2. Utilitaires Flatten et UnwrapPromise
  3. TupleToUnion et UnionToIntersection
  4. Publier une bibliothèque d’utilitaires de types
← Retour à TypeScript Academy