¿Qué es Type-fest y para qué sirve?
\n\nType-fest es una colección de tipos utilitarios para TypeScript, creada por la comunidad de Sindre Sorhus. Esta biblioteca proporciona decenas de tipos listos para usar que resuelven tareas cotidianas al desarrollar en TypeScript: desde transformaciones simples (por ejemplo, hacer que todos los campos de un objeto sean opcionales) hasta tipos condicionales complejos (por ejemplo, extraer el tipo de valor de una Promise).
\n\n¿Para qué sirve esta biblioteca? TypeScript es un lenguaje potente, pero sus tipos incorporados (Partial, Required, Pick, Record) cubren solo los escenarios básicos. En proyectos reales, a menudo se requieren construcciones más específicas: unión profunda de objetos, tipos para trabajar con JSON, tipado estricto de constantes, extracción de tipos de estructuras complejas, etc. Type-fest evita tener que escribir estos tipos manualmente, ahorrando tiempo y reduciendo la probabilidad de errores.
\n\nLa biblioteca cuenta con mantenimiento activo, tiene más de 10 000 estrellas en GitHub y se utiliza en proyectos importantes como Next.js, Vite y Expo.
\n\nInstalación
\n\nType-fest es un paquete npm que se instala como dependencia de desarrollo (ya que los tipos no afectan al runtime).
\n\n# npm\nnpm install --save-dev type-fest\n\n# yarn\nyarn add --dev type-fest\n\n# pnpm\npnpm add --save-dev type-fest\n\nTenga en cuenta: la biblioteca no se instala mediante pip, está diseñada exclusivamente para TypeScript/JavaScript.
\n\nInicio rápido
\n\nDespués de la instalación, puede importar cualquier tipo de la biblioteca. Veamos un ejemplo sencillo: el uso del tipo PartialDeep, que hace que todos los campos de un objeto (incluidos los anidados) sean opcionales.
import type { PartialDeep } from 'type-fest';\n\ninterface User {\n id: number;\n name: string;\n address: {\n city: string;\n zip: number;\n };\n}\n\n// Partial normal solo hace opcionales los campos del primer nivel\ntype PartialUser = Partial<User>;\n// { id?: number; name?: string; address?: { city: string; zip: number; } }\n\n// PartialDeep hace opcionales todos los campos anidados\ntype DeepPartialUser = PartialDeep<User>;\n// { id?: number; name?: string; address?: { city?: string; zip?: number; } }\n\nconst user: DeepPartialUser = {\n name: 'Alice',\n address: {\n city: 'Wonderland'\n // zip se puede omitir\n }\n};\n\nComo puede ver, PartialDeep recorre automáticamente todos los niveles de anidación, algo que normalmente habría que escribir manualmente con tipos recursivos.
Métodos/tipos principales
\n\nVeamos los 10 tipos más útiles de Type-fest. Para cada uno se incluye una descripción, parámetros (si los hay) y un ejemplo funcional.
\n\n1. PartialDeep
\nQué hace: Hace que todas las propiedades de un objeto (incluidas las anidadas) sean opcionales. Recorre recursivamente todos los niveles.
\nParámetros: Uno obligatorio: el tipo del objeto.
\nimport type { PartialDeep } from 'type-fest';\n\ninterface Config {\n server: {\n host: string;\n port: number;\n };\n debug: boolean;\n}\n\ntype PartialConfig = PartialDeep<Config>;\n// {\n// server?: {\n// host?: string;\n// port?: number;\n// };\n// debug?: boolean;\n// }\n\nconst config: PartialConfig = {\n server: {\n host: 'localhost'\n // port no se especifica — no hay error\n }\n};\n\n2. RequiredDeep
\nQué hace: Hace que todas las propiedades de un objeto (incluidas las anidadas) sean obligatorias. Es lo opuesto a PartialDeep.
Parámetros: Tipo del objeto.
\nimport type { RequiredDeep } from 'type-fest';\n\ninterface User {\n name?: string;\n address?: {\n city?: string;\n };\n}\n\ntype StrictUser = RequiredDeep<User>;\n// {\n// name: string;\n// address