//
Busca en todas las páginas de la documentación
🤖 Read the SystemsArchitect.io Blog for over 100+ cloud architecture articles 🔥
Usa los tipos utilitarios integrados de TypeScript para transformar y componer tipos de props de React. Deriva nuevos tipos de tipos existentes en lugar de duplicar definiciones.
// Base type
type User = {
id: string;
name: string;
email: string;
role: "admin" | "editor" | "viewer";
createdAt: Date;
};
// Partial - all fields become optional (great for update forms)
type UpdateUserPayload = Partial<User>;
// Pick - select specific fields
type UserPreview = Pick<User, "id" | "name">;
// Omit - exclude specific fields
type CreateUserPayload = Omit<User, "id" | "createdAt">;
// Record - typed key-value map
type RolePermissions = Record<User["role"], string[]>;
const permissions: RolePermissions = {
admin: ["read", "write", "delete"],
editor: ["read", "write"],
viewer: ["read"],
};// Practical component using derived types
type UserFormProps = {
initialData?: Partial<User>;
onSubmit: (data: CreateUserPayload) => void;
};
function UserForm({ initialData, onSubmit }: UserFormProps) {
const [form, setForm] = useState<CreateUserPayload>({
name: initialData?.name ?? "",
email: initialData?.email ?? "",
role: initialData?.role ?? "viewer",
});
return (
<form
onSubmit={(e) => {
e.preventDefault();
onSubmit(form);
}}
>
<input
value={form.name}
onChange={(e) => setForm({ ...form, name: e.target.value })}
/>
<input
value={form.email}
onChange={(e) => setForm({ ...form, email: e.target.value })}
/>
<button type="submit">Save</button>
</form>
);
}Partial<T> hace que todas las propiedades en T sean opcionales. Útil para payloads de actualización donde solo cambias algunos campos.Required<T> es el inverso de Partial - hace que todas las propiedades sean requeridas. Útil para normalizar objetos de configuración con valores por defecto.Pick<T, K> crea un tipo solo con las claves especificadas de T. Úsalo para crear sub-tipos enfocados.Omit<T, K> crea un tipo con todas las claves excepto las especificadas. Común para payloads de creación donde el servidor genera el id.Record<K, V> crea un tipo de objeto con claves de tipo K y valores de tipo V. Perfecto para mapas de búsqueda.Extract<T, U> extrae miembros de una unión que coinciden con U. Extract<User["role"], "admin" | "editor"> devuelve "admin" | "editor".Exclude<T, U> elimina miembros de una unión que coinciden con U. El inverso de Extract.Extrayendo tipos de props de componentes:
// Get props from an existing component
type ButtonProps = React.ComponentProps<typeof Button>;
// Get props of an HTML element
type DivProps = React.ComponentPropsWithoutRef<"div">;
// Extend HTML element props
type CardProps = React.ComponentPropsWithoutRef<"div"> & {
title: string;
elevated?: boolean;
};Props de solo lectura:
type ImmutableUser = Readonly<User>;
// All fields are now readonly - prevents accidental mutation
type DeepReadonly<T> = {
readonly [K in keyof T]: T[K] extends object ? DeepReadonly<T[K]> : T[K];
};Tipos mapeados para estado de formulario:
type FormErrors<T> = Partial<Record<keyof T, string>>;
type UserFormErrors = FormErrors<CreateUserPayload>;
// { name?: string; email?: string; role?: string }NonNullable para eliminar null/undefined:
type MaybeUser = User | null | undefined;
type DefiniteUser = NonNullable<MaybeUser>; // UserPartial<Pick<User, "name" | "email">> te da { name?: string; email?: string }.React.ComponentProps<typeof MyComponent> extrae el tipo de props de cualquier componente, incluso de terceros donde el tipo no está exportado.Parameters<T> y ReturnType<T> funcionan en tipos de funciones. ReturnType<typeof useAuth> te da el tipo de retorno de un hook personalizado.Omit no genera error en claves que no existen en el tipo original. Omit<User, "nonExistent"> silenciosamente devuelve el tipo completo User.Partial hace que todo sea opcional, incluso campos que deberían permanecer requeridos. Usa Partial<Pick<T, K>> & Omit<T, K> para hacer solo algunos campos opcionales.Record<string, T> permite cualquier clave de string. Esto puede ocultar errores tipográficos. Prefiere claves de unión literal cuando el conjunto de claves se conoce.Partial o Readonly. Estos solo operan en propiedades de nivel superior. Necesitas tipos recursivos personalizados para transformaciones profundas.| Enfoque | Ventajas | Desventajas |
|---|---|---|
Partial<T> para actualizaciones | Derivado del tipo fuente, se mantiene sincronizado | Hace todos los campos opcionales, no solo algunos |
| Sub-tipos manuales | Control total sobre cada tipo | Duplica definiciones, se desvía de la fuente |
Composición de Pick / Omit | Selección precisa de campos | Las composiciones profundamente anidadas son difíciles de leer |
.pick() / .omit() de Zod | Validación en tiempo de ejecución + inferencia de tipos | Requiere dependencia de Zod |
Operador satisfies | Valida la forma sin ampliar | No crea un tipo reutilizable |
T sean opcionales.Partial<User> para un cuerpo de solicitud PATCH.Pick<T, K> crea un tipo solo con las claves especificadas de T.Omit<T, K> crea un tipo con todas las claves excepto las especificadas.Pick cuando quieres un pequeño subconjunto; usa Omit cuando quieres la mayoría de campos menos unos pocos.type ButtonProps = React.ComponentProps<typeof Button>;
type DivProps = React.ComponentPropsWithoutRef<"div">;K y valores de tipo V.Record<User["role"], string[]> mapea cada rol a un array de strings de permisos.Extract<T, U> mantiene miembros de la unión que coinciden con U.Exclude<T, U> elimina miembros de la unión que coinciden con U.Extract<"admin" | "editor" | "viewer", "admin" | "editor"> devuelve "admin" | "editor".Partial<Pick<User, "name" | "email">> da { name?: string; email?: string }.Omit<User, "nonExistent"> silenciosamente devuelve el tipo completo User.Partial solo afecta propiedades de nivel superior.DeepPartial<T>.type UpdateUser = Partial<Pick<User, "name" | "email">> & Omit<User, "name" | "email">;Partial<Pick<>> para los campos opcionales con Omit<> para el resto.null y undefined de un tipo.NonNullable<User | null | undefined> da User.type AuthData = ReturnType<typeof useAuth>;ReturnType<T> funciona en cualquier tipo de función, incluyendo hooks y funciones de utilidad.type FormErrors<T> = Partial<Record<keyof T, string>>;Record<keyof T, string> mapea cada clave de T a un valor string.Partial hace que cada mensaje de error sea opcional.Revisado por Chris St. John·Última actualización: 19 jul 2026
🤖 Read the SystemsArchitect.io Blog for over 100+ cloud architecture articles 🔥