TypeScript 4.6 Bêta

Par:
fredericmazue

jeu, 17/02/2022 - 13:12

Microsoft vient de publier TypeScript 4.6 Bêta. Parmi les nouveautés, nous remarquons la possibilité de placer du code dans les constructeurs de classe avant l'appel à super().

Dans les classes JavaScript, il est obligatoire d'appeler super() avant de faire référence à this. TypeScript applique également cela, mais il était un peu trop strict dans la façon dont il le garantissait. Dans TypeScript, c'était auparavant une erreur de placer du code au début d'un constructeur si la classe avait des initialiseurs de propriété. Par exemple :

class Base {
    // ...
}

class Derived extends Base {
    someProperty = true;

    constructor() {
        // error!
        // have to call 'super()' first because it needs to initialize 'someProperty'.
        doSomeStuff();
        super();
    }
}

C'était un moyen facile de vérifier que super() était appelé avant que this soit référencé, mais cela pouvait aboutir à rejeter beaucoup de code valide, explique Microsoft. Pour remédier à cela, TypeScript est plus indulgent et permet à du code d'être exécuté avant l'appel à super() tout en s'assurant que cet appel est fait avant toute référence à this.

Quelques-unes des autres nouveautés apportées par TypeScript 4.6 :

  • Vérifications améliorées de la profondeur de récursivité
  • Améliorations de l'inférence d'accès indexé
  • Analyse de flux de contrôle pour les paramètres dépendants
  • Plus d'erreurs de syntaxe et de liaison dans JavaScript

En ce qui concerne le dernier point, TypeScript a élargi son ensemble d'erreurs de syntaxe et de liaison dans les fichiers JavaScript.

Par exemple, si vous avez deux déclarations d'une même constante dans la même portée d'un fichier JavaScript, TypeScript émettra désormais une erreur sur ces déclarations.

const foo = 1234;
//    ~~~
// error: Cannot redeclare block-scoped variable 'foo'.

// ...
const foo = 5678;
//    ~~~
// error: Cannot redeclare block-scoped variable 'foo'.

Autre exemple, TypeScript vous indiquera si un modificateur est utilisé de manière incorrecte.

function container() {
    export function foo() {
//  ~~~~~~
// error: Modifiers cannot appear here.
    }
}