DeepPartial y DeepReadonly
Cree versiones recursivas de Partial y Readonly.
DeepPartial y DeepReadonly es una lección gratuita de TypeScript Academy en CoddyKit. Esta es la lección 1 de 4. Puedes leer la lección completa abajo gratuitamente — luego la practicas en el navegador con un editor de código integrado y un tutor de IA 24/7. Forma parte de la ruta de aprendizaje de TypeScript Academy, y tu progreso se sincroniza en la web y la app de CoddyKit. El curso de TypeScript Academy incluye 4 lecciones en total.
¿Por qué usar tipos de utilidad profundos?
Los tipos integrados Partial y Readonly solo se aplican a un nivel de profundidad. Para objetos anidados, necesita versiones recursivas.
interface Config {
db: { host: string; port: number };
app: { name: string };
}
type Shallow = Partial<Config>;
// Shallow.db is still required — only top level is optionalImplementar DeepPartial
Recorra recursivamente las propiedades del objeto mediante un mapeo, haciendo que cada una sea opcional y aplicando recursivamente DeepPartial si el valor de la propiedad es un objeto.
type DeepPartial<T> = T extends object
? { [K in keyof T]?: DeepPartial<T[K]> }
: T;DeepPartial en acción
Aplique DeepPartial a un tipo de configuración anidado y observe cómo todos los niveles se vuelven opcionales.
type PartialConfig = DeepPartial<Config>;
// PartialConfig.db?: { host?: string; port?: number }
const c: PartialConfig = { db: { host: "localhost" } };
// No error — all other fields are optionalImplementar DeepReadonly
Haga que cada propiedad, en todos los niveles de profundidad, sea readonly mediante la recursión en los tipos de objeto anidados.
type DeepReadonly<T> = T extends object
? { readonly [K in keyof T]: DeepReadonly<T[K]> }
: T;DeepReadonly en acción
Una configuración profundamente congelada no puede modificarse en ningún nivel.
type ReadonlyConfig = DeepReadonly<Config>;
const cfg: ReadonlyConfig = { db: { host: "localhost", port: 5432 }, app: { name: "my-app" } };
// cfg.db.port = 3000; // Error: readonlyGestionar arrays en tipos profundos
Los arrays requieren un tratamiento especial: asigne tipos de elementos recursivamente en lugar de tratar los arrays como objetos simples.
type DeepPartial<T> =
T extends (infer U)[]
? DeepPartial<U>[]
: T extends object
? { [K in keyof T]?: DeepPartial<T[K]> }
: T;Gestionar tipos primitivos
El caso base de la recursión debe devolver los tipos primitivos tal cual, sin envolverlos en un tipo mapeado de objeto.
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]> };Combinar DeepPartial y DeepReadonly
Puede combinarlos para crear un tipo profundamente parcial y de solo lectura que permita aplicar parches de configuración de forma segura.
type SafePatch<T> = DeepReadonly<DeepPartial<T>>;Consideraciones de rendimiento
Los tipos recursivos aplicados a objetos muy grandes pueden ralentizar la comprobación de tipos de TypeScript. Considere limitar la profundidad o usar una evaluación diferida en el código crítico para el rendimiento.
// For very deep schemas, consider using Zod or io-ts
// which provide runtime + compile-time deep typingUso real: parches del estado de React
DeepPartial es perfecto para funciones de parcheo del estado que aceptan únicamente el subconjunto modificado de un objeto de estado grande.
function patch<T>(state: T, changes: DeepPartial<T>): T {
return { ...state, ...changes } as T;
}Resumen: tipos de utilidad profundos
DeepPartial y DeepReadonly son tipos mapeados recursivos que aplican su modificador a cada nivel de un objeto anidado. Gestione los arrays por separado y use casos base para los tipos primitivos.
Comprobación rápida
¿Cuál es el caso base recursivo correcto para DeepPartial?
Lo que ha aprendido
Ha implementado DeepPartial y DeepReadonly mediante tipos mapeados recursivos. Gestione los arrays como un caso especial y devuelva siempre los tipos primitivos sin cambios en el caso base.
Preguntas frecuentes
¿La lección «DeepPartial y DeepReadonly» es gratis?
Sí — el texto completo de «DeepPartial y DeepReadonly» es gratis para leer aquí en la web. Para practicarla de forma interactiva (editor de código integrado y tutor de IA 24/7) y desbloquear el resto del curso de TypeScript Academy, actualiza a CoddyKit PRO. El curso de TypeScript Academy incluye 4 lecciones en total.
¿Qué aprenderé en «DeepPartial y DeepReadonly»?
Cree versiones recursivas de Partial y Readonly. Practicas TypeScript Academy con código real que ejecutas directamente en el navegador, y un tutor de IA 24/7 responde tus preguntas mientras trabajas en la lección.
¿Necesito experiencia previa para empezar TypeScript Academy?
No se requiere experiencia previa. TypeScript Academy en CoddyKit está estructurado para principiantes hasta estudiantes avanzados, así que puedes empezar aquí o desde el inicio y avanzar a tu ritmo. Esta es la lección 1 de 4.
¿Cuánto tiempo toma la lección «DeepPartial y DeepReadonly»?
La mayoría de las lecciones de CoddyKit toman alrededor de 5–10 minutos. Cada una es compacta e interactiva, así que avanzas constantemente y retomas exactamente por donde dejaste en la web y la app.
¿Puedo escribir y ejecutar código en esta lección de TypeScript Academy?
Sí. Cada lección de TypeScript Academy incluye un editor de código integrado, así que escribes y ejecutas código real directamente en tu navegador y obtienes retroalimentación instantánea de IA — sin configuración local necesaria.
Todas las lecciones de este curso
- DeepPartial y DeepReadonly
- Utilidades Flatten y UnwrapPromise
- TupleToUnion y UnionToIntersection
- Publicación de una biblioteca de utilidades de tipos