Sortie de TypeScript 2.9

Par:
fredericmazue

lun, 04/06/2018 - 18:09

Microsoft vient d'annoncer la sortie de TypeScript en version 2.9. Cette mouture vient avec de nouvelles fonctionnalités intéressantes.

La fonctionnalité d'importation de code a été enrichie et assouplie. Auparavant il n'était pas possible de référencer un type déclaré dans un module, ou le module lui-même, sans écrire une directive import au début du fichier. De même il n'était pas possible de référencer un type déclaré dans un module dans la portée globale. C'est pourquoi TypeScript 2.9 introduit la nouvelle syntaxe d'importation de type import(...).

Cette nouvelle directive s'utilise par exemple comme ceci :

// foo.ts

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

// bar.ts
export function greet(p: import("./foo").Person) {
    return `
        Hello, I'm ${p.name}, and I'm ${p.age} years old.
    `;
}

Le code bar.ts n'a pas de directive import en tête. Si besoin est de référencer le type d'un module, le code ci-dessus pourrait être réécrit comme ceci :

export async function bar() {
    let foo: typeof import("./foo") = await import("./foo");
}

Désormais, l'inférence de type de TypeScript s'applique aux fichiers JSON importés, ce qui permet la détection d'erreurs de type lors des opérations de modifications de valeurs des propriétés de l’objet JSON correspondant.

Ce nouveau comportement est optionnel et doit tout d'abord être activé par configuration, comme ceci :

// ./tsconfig.json
{
    " compilerOptions " : {
         " module " : " commonjs " ,
         " resolveJsonModule " : true ,
         " esModuleInterop " : true
        " outDir " : " lib "
    },
    " include " : [ " src " ]
}

Ensuite, soit un fichier JSON à importer :

// ./src/settings.json
{
    "dry": false,
    "debug": false
}

Enfin, le code ci-dessous, importe le fichier JSON et produira une erreur lors qu'une mauvaise affectation de valeur :

// ./src/foo.ts

import settings from "./settings.json"; 

settings.debug === true;  // Okay
settings.dry === 2;       // Error! Can't compare a `boolean` and `number`