Logo dévoreur 2 code
Blog

10 astuces Typescript pour les développeurs débutants

Fabien Schlegel

Fabien Schlegel

7 min

publié le : 07/06/2023

#typescript
Image d'illustration pour 10 astuces Typescript pour les développeurs débutants

En tant que développeur débutant, TypeScript peut parfois être accablant. Cependant, avec les bonnes astuces et techniques, vous pouvez exploiter la puissance de TypeScript pour écrire un code plus sûr et plus fiable. Dans cet article, je vais partager 10 astuces TypeScript qui vous aideront à améliorer votre flux de développement et votre compréhension du langage.

Activer le mode strict

L'une des meilleures caractéristiques de TypeScript est son système de vérification de type strict. En activant le mode strict, TypeScript effectuera des vérifications de type plus approfondies et fournira de meilleurs messages d'erreur. Pour activer le mode strict, ajoutez l'option "strict" : true à votre fichier tsconfig.json :

{
  "compilerOptions": {
    "strict": true
  }
}

L'activation du mode strict dès le début de votre projet vous aidera à détecter rapidement les erreurs potentielles et à garantir une meilleure qualité de code.

Utiliser des types explicites

TypeScript est une affaire de types, il est donc important d'être explicite lors de la définition des types. Évitez de vous fier à l'inférence de type et spécifiez explicitement les types pour les variables, les paramètres de fonction et les valeurs de retour. Cela améliore la lisibilité du code et permet aux autres développeurs de comprendre plus facilement votre code. En voici un exemple :

function addNumbers(a: number, b: number): number {
  return a + b;
}

Tirer parti des interfaces

Les interfaces en TypeScript vous permettent de définir la forme des objets et de spécifier les types de leurs propriétés. Elles constituent un outil puissant pour créer un code réutilisable et facile à maintenir. Au lieu d'utiliser des annotations de type en ligne, envisagez de définir des interfaces pour les structures de données complexes. Par exemple :

interface User {
  name: string;
  age: number;
  email: string;
}

function sendEmail(user: User) {
  // ...
}

L'utilisation d'interfaces permet non seulement d'améliorer la clarté du code, mais aussi de vérifier le type des propriétés des objets.

Utiliser les types Union et les protections de type

Les types Union permettent de définir une variable qui peut avoir plusieurs types. C'est utile dans les situations où une variable peut avoir différentes valeurs possibles. Les gardes de type, comme typeof et instanceof, vous aident à restreindre le type dans un bloc conditionnel. Voici un exemple :

type Shape = 'circle' | 'square' | 'triangle';

function getArea(shape: Shape, size: number): number {
  if (shape === 'circle') {
    return Math.PI * size * size;
  } else if (shape === 'square') {
    return size * size;
  } else if (shape === 'triangle') {
    return (Math.sqrt(3) / 4) * size * size;
  }
}

const area = getArea('circle', 5);

En utilisant des types d'union et des gardes de type, vous pouvez écrire un code plus flexible et plus robuste qui gère différents scénarios.

Déstructurer les objets et les tableaux

La déstructuration est une fonctionnalité pratique de TypeScript qui vous permet d'extraire des valeurs d'objets et de tableaux. Elle peut rendre votre code plus concis et plus lisible. Au lieu d'accéder directement aux propriétés des objets ou aux éléments des tableaux, vous pouvez les déstructurer en variables distinctes. Voici un exemple :

interface Person {
  name: string;
  age: number;
  address: string;
}

function greet(person: Person) {
  const { name, age } = person;
  console.log(`Hello, ${name}! You are ${age} years old.`);
}

const user = { name: 'Alice', age: 25, address: '123 Main St' };
greet(user);

La déstructuration ne simplifie pas seulement votre code, elle réduit également le besoin d'accès répétitif aux objets ou aux tableaux.

Utiliser les génériques pour un code réutilisable

Les génériques vous permettent de créer des composants de code réutilisables qui fonctionnent avec différents types. Ils offrent flexibilité et sécurité des types en permettant de paramétrer les types dans les fonctions, les classes et les interfaces. En utilisant les génériques, vous pouvez écrire des fonctions ou des classes qui peuvent fonctionner avec une variété de types de données tout en maintenant la sécurité de type. Voici un exemple :

function identity<T>(value: T): T {
  return value;
}

const result = identity<number>(42);

Dans cet exemple, la fonction identity utilise un paramètre de type générique T pour indiquer qu'elle peut accepter et retourner n'importe quel type. Lors de l'invocation de la fonction, vous pouvez spécifier le type explicitement (par exemple, identity<number>(42)) ou laisser TypeScript déduire le type sur la base de l'argument.

Utiliser l'assertion de type

L'assertion de type est un moyen d'indiquer au compilateur TypeScript le type spécifique d'une valeur lorsque vous disposez de plus d'informations que le vérificateur de type. Elle permet d'outrepasser le type déduit et de traiter la valeur comme un type différent. Utilisez l'assertion de type avec prudence et uniquement lorsque vous êtes sûr de la compatibilité des types. Voici un exemple :

let value: any = 'Hello, TypeScript!';
let length: number = (value as string).length;

Dans ce cas, la valeur est explicitement déclarée comme étant une chaîne de caractères en utilisant le mot-clé as. Cela permet d'accéder à la propriété length, qui est spécifique aux chaînes de caractères.

Tirer parti de l'inférence de type

TypeScript possède de puissantes capacités d'inférence de type, ce qui signifie qu'il peut automatiquement déduire le type d'une variable en fonction de sa valeur. Vous pouvez exploiter l'inférence de type pour réduire le besoin d'annotations de type explicites, ce qui rend votre code plus concis et plus lisible. En voici un exemple :

let message = 'Hello, TypeScript!';
// TypeScript infers the type of 'message' as string

let numbers = [1, 2, 3, 4, 5];
// TypeScript infers the type of 'numbers' as number[]

Dans ces exemples, TypeScript déduit le type des variables sur la base des valeurs attribuées. Cependant, notez que les annotations de type explicites peuvent toujours être utiles pour améliorer la clarté du code, en particulier dans les scénarios complexes.

Utiliser des paramètres de fonction optionnels et par défaut

TypeScript vous permet de définir des paramètres de fonction optionnels en ajoutant un ? après le nom du paramètre. Cela vous permet de fournir des valeurs par défaut ou de rendre certains paramètres optionnels lors de l'appel d'une fonction. Voici un exemple :

function greet(name: string, greeting?: string) {
  if (greeting) {
    console.log(`${greeting}, ${name}!`);
  } else {
    console.log(`Hello, ${name}!`);
  }
}

greet('Alice'); // Hello, Alice!
greet('Bob', 'Hi'); // Hi, Bob!

Dans ce cas, le paramètre greeting est optionnel, et s'il n'est pas fourni, la fonction revient à un message d'accueil par défaut.

Utiliser les types d'intersection pour une composition flexible des types

Les types d'intersection vous permettent de combiner plusieurs types en un seul type, en créant un nouveau type qui possède toutes les propriétés et méthodes de chaque type constitutif. Cela offre une certaine souplesse dans la composition des types et peut s'avérer particulièrement utile lorsqu'il s'agit de structures d'objets complexes. En voici un exemple :

type Greeting = {
  greet(): void;
};

type Farewell = {
  sayGoodbye(): void;
};

type GreetingAndFarewell = Greeting & Farewell;

class Person implements GreetingAndFarewell {
  greet() {
    console.log('Hello!');
  }

  sayGoodbye() {
    console.log('Goodbye!');
  }
}

const person = new Person();
person.greet(); // Hello!
person.sayGoodbye(); // Goodbye!

Dans cet exemple, nous définissons les types Greeting et Farewell, qui représentent des objets ayant des méthodes spécifiques. En utilisant l'opérateur d'intersection de types (&), nous créons un nouveau type GreetingAndFarewell qui combine les deux types. La classe Personne implémente alors le type GreetingAndFarewell, ce qui l'oblige à fournir des implémentations pour les méthodes greet et sayGoodbye.

En utilisant les types d'intersection, vous pouvez créer des compositions de types flexibles et réutilisables pour représenter des comportements et des structures complexes dans votre code TypeScript.

Conclusion

TypeScript est un langage de programmation puissant qui apporte le typage statique et des fonctionnalités avancées au développement JavaScript. Ces conseils vous aideront à écrire un code plus propre, plus facile à maintenir et à augmenter votre productivité.

Adoptez le système de type fort de TypeScript et profitez de son support d'outils pour créer des applications robustes et évolutives. N'oubliez pas de vous tenir au courant des dernières avancées de TypeScript et de continuer à apprendre pour rester en tête dans le monde en constante évolution du développement web.

Commencez à appliquer ces conseils dès aujourd'hui et libérez tout le potentiel de TypeScript dans vos projets. Bon codage !

Articles associés


Image d'illustration pour l'article

Débuter React avec Typescript

Ces technologies sont des choix judicieux pour créer des applications web solides et fiables. Il n'a jamais été aussi facile de développer une expérience utilisateur de qualité avec React et Typescript.

Lire l'article

6 min