Typescript
Debutant
Quiz-Typescript-Debutant
Typescript-Types
Typescript-Interfaces
Union-Types
Questions-Entretien-Typescript
Qcm-Typescript
Apprendre-Typescript
Type-Inference
Ts-Fondamentaux
Front-End
Back-End
Javascript-Typage
📝
Entretien TypeScript Débutant — Types et Interfaces
20 questions sur les bases de TypeScript : types primitifs, interfaces, unions, types littéraux, fonctions typées et inférence de type. Idéal pour préparer un premier entretien TypeScript.
Banque de révision : les 30 questions corrigées
Voici l'intégralité des 30 questions de « Entretien TypeScript Débutant — Types et Interfaces », chacune avec sa bonne réponse et son explication. Le quiz interactif ci-dessus en tire une sélection aléatoire à chaque tentative — utilisez cette liste complète pour réviser.
Explication :
TypeScript est un sur-ensemble typé de JavaScript développé par Microsoft. Il ajoute des fonctionnalités comme le typage statique, les classes, les interfaces, et les génériques, et se compile en JavaScript standard.
Tout code JavaScript valide est aussi du code TypeScript valide. TypeScript ajoute des fonctionnalités sans casser la compatibilité.
Explication :
La commande
npm install -g typescript installe TypeScript globalement sur votre système. Le flag -g signifie "global". Une fois installé, la commande tsc (TypeScript Compiler) est disponible.
Pour vérifier l'installation :
tsc --version. Pour un projet local, utilisez npm install --save-dev typescript.
Explication :
La commande
tsc monfichier.ts (TypeScript Compiler) compile le fichier TypeScript et génère un fichier JavaScript du même nom (monfichier.js).
Utilisez
tsc --watch monfichier.ts pour compiler automatiquement à chaque modification.
Explication :
Le fichier
tsconfig.json est le fichier de configuration principal de TypeScript. Il permet de définir les options du compilateur (target, module, strict, etc.), les fichiers à inclure/exclure, et les chemins de résolution.
Générez un tsconfig.json par défaut avec
tsc --init.
Explication :
En TypeScript, on utilise la syntaxe
let nom: string = "Jean"; où : string est l'annotation de type. TypeScript peut aussi inférer le type automatiquement si on omet l'annotation.
TypeScript distingue
string (type primitif) de String (objet wrapper). Utilisez toujours string en minuscule.
Explication :
TypeScript supporte les mêmes types primitifs que JavaScript :
string, number, boolean, null, undefined, symbol (ES6), et bigint (ES2020).
En TypeScript,
number couvre à la fois les entiers et les nombres à virgule flottante.
Explication :
Les deux syntaxes sont valides :
type[] (forme courte) et Array<type> (forme générique). Exemple : let nombres: number[] = [1, 2, 3]; ou let nombres: Array<number> = [1, 2, 3];.
La syntaxe
type[] est plus courante et plus lisible pour les débutants.
Explication :
Le type
any est un type "échappatoire" qui désactive complètement la vérification de type. Une variable de type any peut recevoir n'importe quelle valeur et appeler n'importe quelle méthode sans erreur de compilation.
Évitez
any autant que possible. Utilisez unknown si vous ne connaissez pas le type à l'avance.
Explication :
let déclare une variable qui peut être réassignée. const déclare une constante : la variable ne peut pas être réassignée après sa déclaration. Cependant, pour les objets, les propriétés internes d'un const peuvent être modifiées.
Privilégiez
const par défaut, et utilisez let uniquement quand vous avez besoin de réassigner la variable.
Explication :
On peut typer les paramètres (
a: number) et optionnellement le retour (: number). Si le type de retour est omis, TypeScript l'infère automatiquement. Les deux syntaxes sont correctes, mais typer explicitement le retour est une bonne pratique.
Pour les fonctions qui ne retournent rien, utilisez le type
void : function log(message: string): void { console.log(message); }.
Explication :
L'inférence de type est la capacité de TypeScript à déterminer automatiquement le type d'une variable en fonction de sa valeur initiale. Par exemple,
let nom = "Jean"; est automatiquement typé comme string sans annotation explicite.
L'inférence fonctionne bien pour les cas simples. Pour les fonctions complexes, les annotations explicites sont recommandées.
Explication :
Un paramètre optionnel se déclare avec un
? après le nom du paramètre : nom?: string. Les paramètres optionnels doivent toujours venir après les paramètres obligatoires.
Vous pouvez aussi fournir une valeur par défaut :
function saluer(nom: string = "Monde").
Explication :
Le type
void représente l'absence de type. Il est principalement utilisé pour les fonctions qui ne retournent pas de valeur. Une variable de type void ne peut recevoir que undefined ou null (si strictNullChecks est désactivé).
Une fonction
void peut retourner undefined ou null (selon la configuration), mais pas une valeur concrète.
Explication :
unknown est l'alternative sécurisée à any. Une variable de type unknown peut recevoir n'importe quelle valeur, mais avant de pouvoir l'utiliser, vous devez vérifier son type (via typeof, instanceof, ou une assertion de type).
Préférez
unknown à any pour représenter des valeurs dont le type n'est pas connu à l'avance.
Explication :
Les types union se créent avec le symbole
| (pipe). let id: string | number; signifie que id peut être soit une string, soit un number.
Les types union sont très utiles pour les fonctions qui acceptent différents types de paramètres.
Explication :
Une interface définit un contrat qu'un objet doit respecter. Elle spécifie les noms, types et optionnalité des propriétés et méthodes. Les interfaces n'existent qu'à la compilation et n'ont pas de représentation en JavaScript.
Exemple :
interface Personne { nom: string; age: number; }
Explication :
Une propriété optionnelle se déclare avec un
? avant les deux-points : age?: number. L'objet peut alors avoir ou ne pas avoir cette propriété.
La différence entre
age?: number et age: number | undefined est subtile : le premier autorise l'absence de la propriété, le second exige sa présence (même si sa valeur est undefined).
Explication :
Les interfaces sont spécifiquement conçues pour décrire la forme des objets et peuvent être déclarées plusieurs fois (fusion). Les type aliases peuvent représenter n'importe quel type (unions, intersections, tuples, primitifs) mais ne supportent pas la fusion automatique.
Utilisez interface par défaut pour les objets, type pour les unions, tuples, ou types utilitaires.
Explication :
Une classe implémente une interface avec le mot-clé
implements. La classe doit alors fournir toutes les propriétés et méthodes définies dans l'interface. Exemple : class Employe implements Personne { nom: string; age: number; }.
Une classe peut implémenter plusieurs interfaces :
class A implements B, C { }.
Explication :
Le type
never représente des valeurs qui ne se produisent jamais. Par exemple, une fonction qui lève toujours une exception ou qui a une boucle infinie retourne never. never est aussi utilisé pour l'exhaustivité dans les unions discriminées.
Exemple :
function erreur(message: string): never { throw new Error(message); }
Explication :
Un tuple se déclare avec la syntaxe
[type1, type2, ...]. Exemple : let personne: [string, number] = ["Jean", 30]; définit un tableau avec exactement deux éléments : une string et un nombre.
Les tuples sont utiles pour retourner plusieurs valeurs d'une fonction tout en gardant un typage précis.
Explication :
Une assertion de type est une façon de dire au compilateur : "Fais-moi confiance, je sais que cette valeur est de ce type". Elle se fait avec
as Type ou <Type>valeur. Elle n'a aucun impact à l'exécution.
Exemple :
let maValeur: unknown = "hello"; let longueur = (maValeur as string).length;
Explication :
Les enums se déclarent avec le mot-clé
enum. Par défaut, les membres sont numérotés à partir de 0. Exemple : enum Couleur { Rouge, Vert, Bleu } donne Rouge=0, Vert=1, Bleu=2.
Préférez les unions de strings littérales (
type Couleur = "Rouge" | "Vert" | "Bleu") aux enums pour un code JavaScript plus simple.
Explication :
Le modificateur
readonly marque une propriété comme étant en lecture seule. Elle ne peut être modifiée qu'au moment de l'initialisation (dans la déclaration ou dans le constructeur pour les classes).
Exemple :
interface Point { readonly x: number; readonly y: number; }
Explication :
Le paramètre rest se déclare avec
... suivi d'un tableau typé. Les deux syntaxes sont valides : ...nombres: number[] ou ...nombres: Array<number>. Ce paramètre capture tous les arguments restants dans un tableau.
Le paramètre rest doit toujours être le dernier paramètre de la fonction.
Explication :
L'option
"strict": true active un ensemble de vérifications de type strictes, incluant noImplicitAny, strictNullChecks, strictFunctionTypes, etc. C'est fortement recommandé pour un code de qualité.
Commencez avec
"strict": true pour les nouveaux projets. Pour les projets existants, activez les options une par une.
Explication :
L'opérateur
! (postfixe) est une assertion non-null. Il indique au compilateur que la valeur ne sera pas null ou undefined, même si le typage dit le contraire. Exemple : maVariable!.length.
Utilisez cet opérateur avec parcimonie. Une vérification explicite (
if (maVariable) { ... }) est souvent préférable.
Explication :
Les génériques permettent de créer des composants réutilisables qui fonctionnent avec plusieurs types. La syntaxe utilise
<T> (ou n'importe quel nom) avant les paramètres. Les deux exemples sont corrects : T et Type sont des noms conventionnels.
Le nom
T (pour Type) est une convention, mais vous pouvez utiliser des noms plus descriptifs comme Key, Value, etc.
Explication :
Cette erreur se produit quand vous tentez d'accéder à une propriété que le type de la variable ne possède pas. Par exemple,
let x: number; x.length; génère cette erreur car number n'a pas de propriété length.
Vérifiez le type de votre variable. Utilisez une assertion de type ou une interface appropriée si nécessaire.
Explication :
Vous pouvez définir la cible de compilation (target) soit dans
tsconfig.json avec "target": "ES5", soit via la ligne de commande tsc --target ES5. TypeScript peut compiler vers ES3, ES5, ES6/ES2015, ES2016, etc.
Pour les navigateurs anciens, utilisez ES5. Pour les environnements modernes, ES2020 ou ESNext donne un code plus optimisé.