2016-06-14 1 views
0

L'un des principaux avantages de Typescript listés sur la page d'accueil de typescriptlang.org est la possibilité d'écrire un «état de l'art Javascript» qui sera compilé à toute cible ES3 ou plus récente. Je peux utiliser beaucoup de fonctions ES6 dans Typescript, y compris let et const, les fonctions de flèches, la déstructuration, les littéraux de gabarit, etc.Quand les méthodes ES6 comme String.includes ou Number.isInteger seront-elles incluses dans Typescript?

J'essaie de comprendre pourquoi certaines fonctionnalités ES6 ne sont pas disponibles dans Typescript. Existe-t-il une feuille de route spécifiant quand certaines fonctionnalités ES6 seront ajoutées à Typescript ou une explication sur les raisons pour lesquelles elles ne le sont pas? Par exemple, essayer d'utiliser String.includes dans Typescript provoque une erreur, et le javascript résultant n'est pas transpilé et échoue dans les navigateurs qui ne supportent pas la méthode.

La version transpiled (avec objectif fixé à ES5 dans tsconfig.json) cela échoue dans Opera:

let homer = "homer simpson"; 

if(homer.includes("homer")) { 
    alert("Yes! We have a homer!"); 
} 

je peux ajouter mon propre polyfill et il fonctionne:

// Polyfill for .includes 
// Source: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/includes 

if (!String.prototype.includes) { 
    String.prototype.includes = function(search, start) { 
    'use strict'; 
    if (typeof start !== 'number') { 
     start = 0; 
    } 

    if (start + search.length > this.length) { 
     return false; 
    } else { 
     return this.indexOf(search, start) !== -1; 
    } 
    }; 
} 

let homer = "homer simpson"; 

if(homer.includes("homer")) { 
    alert("Yes! We have a homer!"); 
} 

A quelques exemples de fonctionnalités ES6 qui sont implémentées dans Typescript

Modèle Littéral

let myDiv = ` 
    <div> 
     <h2>I am part of a template literal.</h2> 
    </div> 
` 

transpiles à

var myDiv = "\n <div>\n  <h2>I am part of a template literal.</h2>\n </div>\n"; 

déstructurante

let [a,b] = [1,2,3]; 

transpiles à

var _a = [1, 2, 3], a = _a[0], b = _a[1]; 

Flèche Fonctions

const arrsq = [1,2,3]; 
const squares = arrsq.map(x => x*x); 

transpiles à

var arrsq = [1, 2, 3]; 
var squares = arrsq.map(function (x) { return x * x; }); 
+2

TypeScript est transpilable pour un certain nombre d'environnements. Sans information contextuelle, il n'a aucun moyen de savoir si des fonctionnalités sont déjà présentes dans cet environnement; et puisque NodeJS est un facteur d'utilisation commun, il n'est pas logique de toujours inclure tous les polyfills. (Notez que ce sont des choses que vous pouvez définir dans tsconfig.json). La meilleure solution consiste à inclure un ensemble standard de polyfills ES6 avec tous les projets Web que vous avez l'intention de réaliser. – Katana314

+0

TypeScript est un super-jeu de javasript. Donc, tout ce qui javascript qui fonctionne/ne fonctionne pas dans un navigateur donné fonctionnera/ne fonctionnera pas en tapuscrit. –

+0

Merci, @ Katana314, c'est exactement ce que je cherchais. –

Répondre

0

Quand sera ES6 des méthodes telles que String.includes ou Number.isInteger être inclus dans Tapuscrit

Ils sont déjà. Vous pouvez utiliser [email protected] avec --lib es6

+0

Cela semble encourageant. Où dois-je configurer cela? Est-ce couvert dans votre livre? –

+0

'Où puis-je configurer cela?' Sur la ligne de commande et dans certains EDI impressionnants: http://alm.tools/ avec 'tsconfig.json'' compilerOptions.lib' – basarat

+0

Va certainement vérifier alm.tools. J'essaierai également de configurer ceci dans VS Code. –