Type-fest pour TypeScript : guide complet avec exemples

Formateur Python en ligne pour débutants

Apprenez Python facilement sans surcharge théorique. Résolvez des tâches pratiques avec vérification automatique et écrivez du code directement dans le navigateur.

Start Course

Qu'est-ce que Type-fest et pourquoi en a-t-on besoin ?

\n\n

Type-fest est une collection de types utilitaires pour TypeScript, créée par la communauté Sindre Sorhus. Cette bibliothèque fournit des dizaines de types prêts à l'emploi qui résolvent les problèmes quotidiens lors du développement en TypeScript : des transformations simples (par exemple, rendre toutes les propriétés d'un objet optionnelles) aux types conditionnels complexes (par exemple, extraire le type de valeur d'une Promise).

\n\n

Pourquoi cette bibliothèque est-elle nécessaire ? TypeScript est un langage puissant, mais ses types intégrés (Partial, Required, Pick, Record) ne couvrent que les scénarios de base. Dans les projets réels, des constructions plus spécifiques sont souvent nécessaires : fusion profonde d'objets, types pour travailler avec JSON, typage strict des constantes, extraction de types à partir de structures complexes, etc. Type-fest évite d'avoir à écrire ces types manuellement, économisant du temps et réduisant la probabilité d'erreurs.

\n\n

La bibliothèque est activement maintenue, compte plus de 10 000 étoiles sur GitHub et est utilisée dans des projets majeurs tels que Next.js, Vite et Expo.

\n\n

Installation

\n\n

Type-fest est un package npm qui s'installe comme dépendance de développement (car les types n'affectent pas l'exécution).

\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\n

Notez que la bibliothèque ne s'installe pas via pip — elle est destinée exclusivement à TypeScript/JavaScript.

\n\n

Démarrage rapide

\n\n

Après l'installation, vous pouvez importer n'importe quel type de la bibliothèque. Prenons un exemple simple — l'utilisation du type PartialDeep, qui rend toutes les propriétés d'un objet (y compris les propriétés imbriquées) optionnelles.

\n\n
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 rend optionnelles uniquement les propriétés de premier niveau\ntype PartialUser = Partial<User>;\n// { id?: number; name?: string; address?: { city: string; zip: number; } }\n\n// PartialDeep rend optionnelles toutes les propriétés imbriquées\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 peut être omis\n  }\n};
\n\n

Comme vous pouvez le voir, PartialDeep parcourt automatiquement tous les niveaux d'imbrication — c'est ce qu'il faudrait écrire manuellement avec des types récursifs.

\n\n

Méthodes/types principaux

\n\n

Examinons les 10 types les plus utiles de Type-fest. Pour chacun, une description, les paramètres (le cas échéant) et un exemple fonctionnel sont fournis.

\n\n

1. PartialDeep

\n

Ce qu'il fait : Rend toutes les propriétés d'un objet (y compris les propriétés imbriquées) optionnelles. Parcourt récursivement tous les niveaux.

\n

Paramètres : Un paramètre obligatoire — le type de l'objet.

\n
import 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 non spécifié — pas d'erreur\n  }\n};
\n\n

2. RequiredDeep

\n

Ce qu'il fait : Rend toutes les propriétés d'un objet (y compris les propriétés imbriquées) obligatoires. L'opposé de PartialDeep.

\n

Paramètres : Le type de l'objet.

\n
import 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                    

Recommendations