TypeScript est un sur-ensemble de JavaScript qui ajoute un système de types statiques à ton code. En clair : tu écris du JavaScript, mais tu précises à l’avance quel type de données tu manipules. Le résultat ? Moins de bugs surprises, un code plus lisible, et un éditeur qui t’aide vraiment à corriger tes erreurs avant même d’exécuter quoi que ce soit.
Mais voilà le problème. Beaucoup de débutants se lancent dans TypeScript sans vraiment comprendre comment l’utiliser correctement. Résultat : ils reproduisent de mauvaises habitudes, contournent le système de types, et finissent par se demander pourquoi tout le monde en fait autant.
Cet article te liste les 7 erreurs les plus fréquentes que les débutants font avec TypeScript, avec pour chacune une explication claire et la façon de la corriger. Si tu utilises déjà React ou Node.js, tu vas reconnaître certaines de ces situations.
Pourquoi TypeScript fait peur au début ?
TypeScript intimide parce qu’il ajoute une couche de syntaxe que JavaScript n’a pas, et les messages d’erreur peuvent sembler cryptiques au premier abord. Quand tu vois une erreur du genre Type 'string' is not assignable to type 'number', ton premier réflexe c’est souvent de chercher comment faire taire l’erreur plutôt que de comprendre ce qu’elle te dit.
C’est exactement là que les mauvaises habitudes commencent. TypeScript n’est pas là pour t’embêter. Il est là pour te protéger des bugs que tu ne verrais pas venir autrement. Comprendre ses erreurs, c’est apprendre à lire les alertes d’un système de sécurité.
Erreur n°1 : utiliser any pour tout faire taire
Le type any désactive complètement la vérification de TypeScript sur une variable, ce qui annule l’intérêt de l’utiliser.
C’est la première réaction de beaucoup de débutants. Une erreur apparaît, tu ne comprends pas pourquoi, alors tu mets any et ça passe. Mais tu viens de redonner à ce bout de code le comportement d’un JavaScript pur, sans filet de sécurité.
// ❌ Mauvaise pratique
let donnee: any = "bonjour";
donnee = 42;
donnee.methodeQuiNExistePas(); // Aucune erreur... mais ça va crasher
// ✅ Bonne pratique
let donnee: string = "bonjour";
// TypeScript t'empêchera d'appeler une méthode qui n'existe pas sur string
Si tu ne sais vraiment pas quel type utiliser, commence par unknown. Il force TypeScript à vérifier le type avant de l’utiliser, ce qui est beaucoup plus sûr que any.
Erreur n°2 : ignorer les interfaces et les types personnalisés
Une interface en TypeScript, c’est un contrat qui décrit la forme d’un objet, ses propriétés et leurs types.
Beaucoup de débutants tapent les objets directement sans créer d’interface, ce qui rend le code difficile à maintenir. Dès que tu as un objet avec plusieurs propriétés, définis son type.
// ❌ Mauvaise pratique
function afficherUtilisateur(user: { nom: string; age: number; email: string }) {
console.log(user.nom);
}
// ✅ Bonne pratique
interface Utilisateur {
nom: string;
age: number;
email: string;
}
function afficherUtilisateur(user: Utilisateur) {
console.log(user.nom);
}
L’interface te permet de réutiliser le type dans tout ton fichier, voire dans tout ton projet. C’est aussi ce qui permet à ton éditeur de t’auto-compléter les propriétés correctement.
Erreur n°3 : ne pas typer les retours de fonction
Typer explicitement le retour d’une fonction, c’est dire à TypeScript exactement ce que cette fonction est censée renvoyer, ce qui évite les bugs silencieux.
TypeScript peut souvent inférer le type de retour tout seul. Mais sur les fonctions importantes, le faire explicitement rend ton code beaucoup plus clair et te protège si tu modifies la fonction plus tard.
// ❌ TypeScript infère, mais tu ne maîtrises pas
function calculerTotal(prix: number, quantite: number) {
return prix * quantite; // TypeScript devine que c'est un number
}
// ✅ Tu explicites ce que tu veux retourner
function calculerTotal(prix: number, quantite: number): number {
return prix * quantite;
}
// Si quelqu'un modifie la fonction et renvoie autre chose, TypeScript te prévient
Erreur n°4 : confondre null, undefined et les types optionnels
En TypeScript, une propriété optionnelle (notée avec ?) peut être undefined, ce qui est différent d’une valeur explicitement null.
C’est une des sources de confusion les plus fréquentes. Voici comment distinguer les deux :
interface Profil {
nom: string;
bio?: string; // bio peut être undefined (pas fournie)
photo: string | null; // photo peut être null (volontairement vide)
}
const profil: Profil = {
nom: "Alice",
photo: null // OK : on dit explicitement qu'il n'y a pas de photo
};
// profil.bio n'est pas fourni = undefined, pas null
La différence compte beaucoup quand tu travailles avec des APIs ou des bases de données. Si tu veux aller plus loin sur la validation des données qui viennent de l’extérieur, jette un oeil à Zod, qui s’intègre parfaitement avec TypeScript pour valider les données à la volée.
Erreur n°5 : ne pas utiliser les unions de types
Un type union permet à une variable d’accepter plusieurs types différents, en les séparant par le symbole |.
Beaucoup de débutants tombent dans le piège d’utiliser any quand une valeur peut être de plusieurs types. La bonne réponse, c’est l’union.
// ❌ Mauvaise pratique
function formaterIdentifiant(id: any): string {
return String(id);
}
// ✅ Bonne pratique
function formaterIdentifiant(id: string | number): string {
return String(id);
}
// TypeScript sait maintenant que id ne peut être que string ou number
// Il va te prévenir si tu passes autre chose
Les unions de types sont aussi très utiles pour gérer les états dans une interface. Par exemple : type Statut = "chargement" | "succès" | "erreur". TypeScript va te forcer à gérer chaque cas possible.
Erreur n°6 : oublier de configurer correctement le fichier tsconfig.json
Le fichier tsconfig.json est la configuration centrale de TypeScript dans ton projet, et sa configuration par défaut est souvent trop permissive pour coder proprement.
Deux options que tu devrais activer dès le départ :
- strict: true : active un ensemble de vérifications strictes, dont
strictNullChecksqui t’empêche d’oublier les casnulletundefined - noImplicitAny: true : interdit à TypeScript d’inférer silencieusement le type
anyquand il ne peut pas déterminer le type
{
"compilerOptions": {
"strict": true,
"noImplicitAny": true,
"target": "ES2020",
"module": "CommonJS",
"outDir": "./dist"
}
}
Active strict: true dès le début d’un projet. Si tu l’actives sur un projet existant, tu vas avoir beaucoup d’erreurs à corriger. Autant partir du bon pied. Si tu utilises Vite.js pour ton build, le template TypeScript configure déjà une bonne partie de ça pour toi.
Erreur n°7 : taper les props de composant à la main dans chaque fichier
Quand ton projet grossit, recopier les mêmes définitions de types dans plusieurs fichiers crée de la duplication et des incohérences.
La bonne pratique, c’est de centraliser tes types dans des fichiers dédiés, souvent un dossier types/ à la racine de ton projet.
// types/utilisateur.ts
export interface Utilisateur {
id: number;
nom: string;
email: string;
role: "admin" | "editeur" | "lecteur";
}
// Puis dans tes autres fichiers :
import type { Utilisateur } from "../types/utilisateur";
Le mot-clé import type (disponible depuis TypeScript 3.8) permet d’importer uniquement les types, sans inclure le code JavaScript correspondant dans le bundle final. C’est une bonne habitude à prendre.
| Erreur fréquente | Ce que ça coûte | La bonne pratique |
|---|---|---|
Utiliser any |
Perd toute la sécurité TypeScript | Utiliser unknown ou un vrai type |
| Pas d’interface | Code impossible à réutiliser | Créer une interface pour chaque objet complexe |
| Retour non typé | Bugs silencieux si la fonction change | Typer explicitement le retour |
| Pas de strict mode | TypeScript trop permissif | Activer strict: true dès le départ |
| Types dupliqués | Incohérences partout dans le projet | Centraliser dans un dossier types/ |
Est-ce que TypeScript vaut vraiment le coup pour un projet solo ?
Oui, même sur un petit projet personnel, TypeScript t’apporte une aide concrète au quotidien, surtout si tu utilises VS Code.
L’auto-complétion devient beaucoup plus précise. Tu cliques sur une variable et ton éditeur te montre exactement quelles propriétés sont disponibles. Tu n’as plus besoin d’aller relire ton code d’il y a trois semaines pour te rappeler ce que contient un objet. Et si tu travailles avec des APIs externes, TypeScript peut modéliser exactement ce que l’API te renvoie, ce qui évite les bugs au moment où le format change.
Pour aller plus loin, si tu construis une vraie appli avec TypeScript, regarde du côté de Next.js qui supporte TypeScript nativement depuis la première ligne de code. Et si tu veux tester que ton code TypeScript fonctionne vraiment comme prévu, Jest s’intègre très bien avec TypeScript via le package ts-jest.
En résumé : TypeScript
TypeScript n’est pas là pour compliquer ta vie. Il est là pour te faire gagner du temps sur le long terme en t’empêchant de livrer des bugs évitables. Les 7 erreurs listées dans cet article reviennent toutes au même réflexe : contourner TypeScript au lieu de le comprendre. Évite any, définis tes interfaces, type tes retours de fonction, active le mode strict et centralise tes types. Ces quelques habitudes suffisent à transformer ton expérience avec TypeScript du tout au tout.
Questions fréquentes sur TypeScript
TypeScript est-il obligatoire pour utiliser React ou Node.js ?
Non, TypeScript est totalement optionnel. React et Node.js fonctionnent très bien en JavaScript pur. Mais la grande majorité des projets professionnels utilisent TypeScript aujourd’hui, donc l’apprendre est clairement un avantage pour trouver un travail ou contribuer à des projets open source.
Est-ce que TypeScript ralentit l’exécution du code ?
Non. TypeScript est compilé en JavaScript avant d’être exécuté. Le navigateur ou Node.js ne voit jamais du TypeScript, il voit du JavaScript classique. Le système de types n’existe qu’au moment du développement, pas à l’exécution. Il y a une étape de compilation en plus, mais des outils comme Vite.js la rendent quasi instantanée.
Quelle est la différence entre interface et type en TypeScript ?
Les deux permettent de définir la forme d’un objet. La principale différence : une interface peut être étendue et fusionnée après coup, tandis qu’un type est plus flexible pour les unions et les types complexes. Dans la pratique, utilise interface pour les objets et type pour les unions, les tuples ou les alias simples. Les deux sont corrects et souvent interchangeables.
Peut-on migrer un projet JavaScript existant vers TypeScript progressivement ?
Oui, c’est même la façon recommandée de procéder. Tu peux renommer tes fichiers de .js à .ts un par un, et TypeScript s’adapte. En configurant allowJs: true dans ton tsconfig.json, TypeScript et JavaScript coexistent dans le même projet pendant la migration. Pas besoin de tout refaire d’un coup.
Comment TypeScript gère-t-il les données qui viennent d’une API externe ?
TypeScript ne peut pas vérifier le contenu d’une réponse API au moment de l’exécution, seulement au moment de la compilation. Pour être vraiment protégé, tu dois valider les données reçues avec une librairie comme Zod, qui vérifie à l’exécution que les données correspondent au type attendu. C’est la combinaison TypeScript plus Zod qui te donne une sécurité complète.
TypeScript fonctionne-t-il avec tous les frameworks JavaScript ?
Oui. TypeScript est supporté nativement ou via des plugins dans pratiquement tous les frameworks modernes : Next.js, Vue.js, Angular (qui l’utilise par défaut), Svelte, Astro, Remix… Si tu démarres un nouveau projet avec l’un de ces frameworks, tu peux activer TypeScript dès l’initialisation du projet.