web-dev-qa-db-fra.com

Comment utiliser TypeScript avec ES6 natif Promises

Je suis un débutant en texte type et je me demande s’il est possible d’utiliser les promesses ES6 dans TypeScript et ce que je devrais faire pour les faire fonctionner. J'exécute le noeud 0.11.14 et j'obtiens une erreur lors de la compilation "Impossible de trouver le nom 'Promise'"

119
dchang

Le fichier lib.d.ts actuel n'a pas de promesse définie, vous avez donc besoin d'un fichier de définition supplémentaire, raison pour laquelle vous obtenez des erreurs de compilation.

Vous pouvez par exemple utiliser (comme le dit @elclanrs) le paquet es6-promise avec le fichier de définition de DefinitelyTyped: définition d'es6-promise

Vous pouvez ensuite l'utiliser comme ceci:

var p = new Promise<string>((resolve, reject) => { 
    resolve('a string'); 
});

edit Vous pouvez l'utiliser sans définition lorsque vous ciblez ES6 (avec le compilateur TypeScript) - Notez que vous avez toujours besoin de la promesse pour qu'elle existe cela ne fonctionnera pas dans les anciens navigateurs :)) Ajoutez/modifiez ce qui suit dans votre tsconfig.json:

"compilerOptions": {
    "target": "ES6"
}

edit 2 Quand TypeScript 2.0 sortira, les choses changeront un peu (bien que ci-dessus fonctionne toujours) mais les fichiers de définition peuvent être installés directement avec npm comme ci-dessous:

npm install --save @types/es6-promise - source

edit3 Mise à jour de la réponse avec plus d’informations sur l’utilisation des types.

Créez un fichier package.json avec uniquement { } comme contenu (si vous n'avez pas encore de package.json. Appelez npm install --save @types/es6-promise et tsc --init. La première commande d'installation npm sera changez votre package.json pour inclure es6-promise en tant que dépendance. tsc --init créera un fichier tsconfig.json pour vous.

Vous pouvez maintenant utiliser la promesse dans votre fichier TypeScript var x: Promise<any>;. Exécutez tsc -p . pour compiler votre projet. Vous ne devriez avoir aucune erreur.

122
Dick van den Brink

Alternative n ° 1

Utilisez les options du compilateur target et lib pour compiler directement dans es5 sans avoir à installer le es6-shim. (Testé avec TypeScript 2.1.4). Dans la section lib, utilisez es2016 ou es2015.promise.

// tsconfig.json
{
    "compilerOptions": {
        "target": "es5",
        "lib": [
            "es2015.promise",
            "dom"
        ]
    },
    "include": [
        "src/**/*.ts"
    ],
    "exclude": [
        "node_modules"
    ]
}

Alternative n ° 2

tilisez NPM pour installer le es6-shim de la organisation des types .

npm install @types/es6-shim --save-dev

Alternative n ° 3

Avant TypeScript 2.0, utilisez typings pour installer le es6-shim globalement à partir de DefinitelyTyped .

npm install typings --global --save-dev
typings install dt~es6-shim --global --save-dev

L'option typings utilise npm pour installer typings globalement, puis typings pour installer la cale. Le préfixe dt~ signifie télécharger la cale de DefinitelyTyped. L'option --global signifie que les types de cales seront disponibles tout au long du projet.

Voir également

https://github.com/Microsoft/TypeScript/issues/7788 - Impossible de trouver le nom 'Promise' ni le nom 'require'

47
Shaun Luttin

À partir de TypeScript 2.0, vous pouvez inclure des typages pour les promesses natives en incluant les éléments suivants dans votre tsconfig.json

"compilerOptions": {
    "lib": ["es5", "es2015.promise"]
}

Cela inclura les déclarations de promesse fournies avec TypeScript sans avoir à définir la cible sur ES6.

23
paldepind

Si vous utilisez node.js 0.12 ou supérieur/TypeScript 1.4 ou supérieur, ajoutez simplement des options de compilateur telles que:

tsc a.ts --target es6 --module commonjs

Plus d'infos: https://github.com/Microsoft/TypeScript/wiki/Compiler-Options

Si vous utilisez tsconfig.json, alors procédez comme suit:

{
    "compilerOptions": {
        "module": "commonjs",
        "target": "es6"
    }
}

Plus d'infos: https://github.com/Microsoft/TypeScript/wiki/tsconfig.json

13
Plantain Yao

C'est la façon la plus récente de procéder, la réponse ci-dessus est obsolète:

typings install --global es6-promise

12
Nick Kenens

A. Si vous utilisez "target": "es5" et la version TypeScript inférieure à 2.0:

typings install es6-promise --save --global --source dt

B. Si vous utilisez "target": "es5" et TypeScript version 2.0 ou supérieure:

"compilerOptions": {
    "lib": ["es5", "es2015.promise"]
}

C. Si vous utilisez "target": "es6", vous n'avez rien à faire.

6
Vaz

tilisation de promesses ES6 natives avec TypeScript dans les outils Visual Studio 2015 + Node.js 1.2

Aucune installation npm requise car ES6 Promises est natif.

projet Node.js -> Propriétés -> Onglet TypeScript Build Version ECMAScript = ECMAScript6

import http = require('http');
import fs = require('fs');

function findFolderAsync(directory : string): Promise<string> {

    let p = new Promise<string>(function (resolve, reject) {

        fs.stat(directory, function (err, stats) {

            //Check if error defined and the error code is "not exists"
            if (err && err.code === "ENOENT") {
                reject("Directory does not exist");
            }
            else {
                resolve("Directory exists");
            }
        });

    });
    return p;
}

findFolderAsync("myFolder").then(

    function (msg : string) {
        console.log("Promise resolved as " + msg); 
    },
    function (msg : string) {
        console.log("Promise rejected as " + msg); 
    }
);
5
Bibek Bhattacharya