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 optionalImplé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 optionalImplé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: readonlyGestion 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 typingUtilisation 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
- DeepPartial et DeepReadonly
- Utilitaires Flatten et UnwrapPromise
- TupleToUnion et UnionToIntersection
- Publier une bibliothèque d’utilitaires de types