Si vous n'êtes pas encore familiarisé avec TypeScript, c'est un langage qui s'appuie sur JavaScript en ajoutant une syntaxe pour les types statiques. Des outils comme le compilateur TypeScript peuvent simplement effacer la syntaxe TypeScript, vous laissant avec un JavaScript propre et lisible qui fonctionne n'importe où. Alors, qu'est-ce que cette syntaxe ajoute si elle est simplement effacée ? Eh bien, lorsque vous ajoutez des types dans tout votre code, vous rendez vos intentions explicites, et TypeScript peut vérifier le type de votre code pour détecter les erreurs telles que les fautes de frappe, les erreurs de logique, etc. TypeScript utilise également ces types pour alimenter les outils de l'éditeur, vous offrant des fonctionnalités intéressantes telles que la complétion précise de code, le changement de nom et la possibilité de vous rendre directement à une définition. Types d'écriture séparés sur les propriétés
En JavaScript, il est assez courant pour les API de convertir les valeurs transmises avant de les stocker. Cela arrive souvent aussi avec les getters et les setters. Par exemple, imaginons que nous ayons une classe avec un setter qui convertit toujours une valeur en number avant de l'enregistrer dans un champ privé.
| Code TypeScript : | Sélectionner tout |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | class Thing { #size = 0; get size() { return this.#size; } set size(value) { let num = Number(value); // Don't allow NaN and stuff. if (!Number.isFinite(num)) { this.#size = 0; return; } this.#size = num; } } |
Le problème est que la size vous permet de lui attribuer plus que de simples number. Nous pourrions contourner ce problème en disant que la size a le type unknown ou any comme dans cet extrait de code:
| Code TypeScript : | Sélectionner tout |
1 2 3 4 5 6 | class Thing { // ... get size(): unknown { return this.#size; } } |
C’est pourquoi TypeScript 4.3 vous permet de spécifier des types de lecture et d’écriture dans les propriétés.
| Code TypeScript : | Sélectionner tout |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | class Thing { #size = 0; get size(): number { return this.#size; } set size(value: string | number | boolean) { let num = Number(value); // Don't allow NaN and stuff. if (!Number.isFinite(num)) { this.#size = 0; return; } this.#size = num; } } |
| Code TypeScript : | Sélectionner tout |
1 2 3 4 5 6 7 8 9 | let thing = new Thing(); // Assigning other types to `thing.size` works! thing.size = "hello"; thing.size = true; thing.size = 42; // Reading `thing.size` always produces a number! let mySize: number = thing.size; |
Gardez à l'esprit qu'il ne s'agit pas d'un modèle limité aux classes. Vous pouvez écrire des getters et des setters avec différents types dans les littéraux d'objet.
| Code TypeScript : | Sélectionner tout |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | function makeThing(): Thing { let size = 0; return { get size(): number { return size; }, set size(value: string | number | boolean) { let num = Number(value); // Don't allow NaN and stuff. if (!Number.isFinite(num)) { size = 0; return; } size = num; } } } |
| Code TypeScript : | Sélectionner tout |
1 2 3 4 5 | // Now valid! interface Thing { get size(): number set size(value: number | string | boolean); } |
override et --noImplicitOverride
Lorsque vous étendez des classes en JavaScript, le langage rend très facile le remplacement des méthodes - mais malheureusement, vous pouvez rencontrer des erreurs. Il manque un grand nombre de noms. Par exemple, prenez les classes suivantes:
| Code TypeScript : | Sélectionner tout |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | class SomeComponent { show() { // ... } hide() { // ... } } class SpecializedComponent extends SomeComponent { show() { // ... } hide() { // ... } } |
| Code TypeScript : | Sélectionner tout |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | class SomeComponent { - show() { - // ... - } - hide() { - // ... - } + setVisible(value: boolean) { + // ... + } } class SpecializedComponent extends SomeComponent { show() { // ... } hide() { // ... } } |
| Code TypeScript : | Sélectionner tout |
1 2 3 4 5 6 7 8 | class SpecializedComponent extends SomeComponent { override show() { // ... } override hide() { // ... } } |
| Code TypeScript : | Sélectionner tout |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | class SomeComponent { setVisible(value: boolean) { // ... } } class SpecializedComponent extends SomeComponent { override show() { // ~~~~~~~~ // Error! This method can't be marked with 'override' because it's not declared in 'SomeComponent'. // ... } // ... } |
Par exemple, vous pourriez accidentellement « piétiner » une méthode qui existe dans une classe de base sans vous en rendre compte.
| Code TypeScript : | Sélectionner tout |
1 2 3 4 5 6 7 8 9 10 11 12 13 | class Base { someHelperMethod() { // ... } } class Derived extends Base { // Oops! We weren't trying to override here, // we just needed to write a local helper method. someHelperMethod() { // ... } } |
Source : Microsoft
Vous avez lu gratuitement 290 articles depuis plus d'un an.
Soutenez le club developpez.com en souscrivant un abonnement pour que nous puissions continuer à vous proposer des publications.
Soutenez le club developpez.com en souscrivant un abonnement pour que nous puissions continuer à vous proposer des publications.