Comment réussir un entretien TypeScript : les meilleures questions de niveau avancé
\n\nUn entretien pour un poste de développeur Senior Frontend ou Fullstack ne se passe rarement sans questions approfondies sur TypeScript. Si vous connaissez parfaitement les types de base et les interfaces, pour réussir un technical interview de haut niveau, vous devez maîtriser le système de types avancé. Dans cet article, nous avons rassemblé les 5 meilleures questions et exercices souvent posés lors des entretiens TypeScript de niveau avancé. Chaque point est accompagné d'une analyse et d'exemples de code.
\n\n1. Types conditionnels (Conditional Types) et le mot-clé infer
\n\nLes types conditionnels permettent de créer des types qui dépendent d'une condition. Combinés avec infer, vous pouvez "extraire" des parties de types, comme dans le Pattern Matching.
Question : Écrivez le type ReturnType (sans utiliser le type intégré).
Analyse : Utilisez un type conditionnel avec infer pour capturer la valeur de retour d'une fonction.
type MyReturnType<T> = T extends (...args: any[]) => infer R ? R : never;\n\n// Exemple d'utilisation\nfunction greet(name: string): string {\n return `Bonjour, ${name}`;\n}\n\ntype GreetReturn = MyReturnType<typeof greet>; // string\n\nComment répondre en entretien : Expliquez que infer R crée une nouvelle variable de type R qui capture le type de retour de la signature de la fonction. Si la condition n'est pas remplie (ce qui est passé n'est pas une fonction), le type devient never.
2. Mapped Types et modificateurs
\n\nLes mapped types permettent de créer de nouveaux types en transformant les propriétés d'un type existant. Le niveau avancé implique de travailler avec les modificateurs +, -, as et les clés via keyof.
Question : Créez un type DeepReadonly qui rend toutes les propriétés d'un objet (y compris les propriétés imbriquées) en readonly.
type DeepReadonly<T> = {\n readonly [K in keyof T]: T[K] extends Record<string, unknown> \n ? DeepReadonly<T[K]> \n : T[K];\n};\n\ninterface User {\n name: string;\n address: {\n city: string;\n zip: number;\n };\n}\n\ntype ReadonlyUser = DeepReadonly<User>;\n// Toutes les propriétés sont devenues readonly, y compris address.city\n\nComment répondre : Montrez l'appel récursif de DeepReadonly pour les objets imbriqués. Expliquez comment Record<string, unknown> est utilisé pour vérifier si une valeur est un objet.
3. Template Literal Types
\n\nLes template literal types permettent de manipuler les types de chaînes de caractères au moment de la compilation. C'est un outil puissant pour créer des API strictes.
\n\nQuestion : Implémentez le type EventName qui prend une chaîne et retourne le type "on{Chaîne}" avec la capitalisation correcte.
type EventName<T extends string> = `on${Capitalize<T>}`;\n\ntype ClickEvent = EventName<'click'>; // "onClick"\ntype FocusEvent = EventName<'focus'>; // "onFocus"\n\n// Exemple avancé : extraction à partir d'une chaîne\ntype ExtractAction<T extends string> = \n T extends `on${infer Action}` ? Uncapitalize<Action> : never;\n\ntype Action = ExtractAction<'onSubmit'>; // "submit"\n\nComment répondre : Notez les types intégrés Capitalize et Uncapitalize. Montrez comment infer fonctionne à l'intérieur des littéraux de template pour analyser les chaînes.
4. Génériques avec contraintes et types de tuples variadiques (Variadic Tuple Types)
\n\nLes variadic tuple types (apparus dans TS 4.0) permettent de travailler avec des tuples de longueur arbitraire. C'est indispensable pour créer des fonctions type-safe avec un nombre variable d'arguments.
\n\nQuestion : Écrivez un type pour une fonction
Blogs
Book Recommendations
Lire aussi
Java Stream.collect en Kotlin : guide complet avec exemples
Erreur TypeScript typique : property 'value' does not exist on HTMLElement
Programmation asynchrone en Swift : guide complet pratique
Travail avancé avec les dates et l'heure en Rust : chrono et time
Docker et Rust : conteneurisation d'applications Rust