Comment utiliser Typescript avec des promesses ES6 natives

Je suis un débutant complet à Typescript et je me demande s'il est possible d'utiliser des promesses ES6 dans Typescript et ce que je devrais faire pour les faire fonctionner. J'exécute le nœud 0.11.14 et j'obtiens une erreur lors de la compilation "impossible de trouver le nom 'Promise' "

110
demandé sur dchang 2014-12-19 23:23:49

8 réponses

La lib actuelle.D. ts n'a pas de promesses définies, donc vous avez besoin d'un fichier de définition supplémentaire pour cela, c'est pourquoi 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: ES6-promise definition

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 lors du ciblage D'ES6 (avec le compilateur TypeScript) - Notez que vous avez toujours besoin de la promesse d'exister dans le runtime ofcourse (donc cela ne fonctionnera pas dans les anciens navigateurs :)) Ajoutez / modifiez ce qui suit à votre tsconfig.json:

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

Modifier 2 Lorsque 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éer un fichier package.json avec seulement { } comme contenu (si vous n'avez pas de paquet.json déjà. Appelez npm install --save @types/es6-promise et tsc --init. La première commande npm install changera votre package.json pour inclure la promesse es6 en tant que dépendance. tsc --init va créer 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 devriez avoir aucune erreur.

110
répondu Dick van den Brink 2017-03-10 21:17:17

Alternative # 1

Utilisez les options du compilateur target et lib pour compiler directement dans es5 sans avoir besoin d'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 # 2

Utiliser NPM pour installer le es6-shim de la types d'organisation.

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

Alternative # 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

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

Voir aussi

Https://github.com/Microsoft/TypeScript/issues/7788, Impossible de trouver le nom de "Promesse" & Ne peut pas trouver le nom de 'besoin'

45
répondu Shaun Luttin 2017-05-10 14:42:48

À partir de TypeScript 2.0, vous pouvez inclure des typages pour les promesses natives en incluant ce qui suit 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.

20
répondu paldepind 2016-09-28 13:52:55

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

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

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

Si vous utilisez tsconfig.json, alors, comme ceci:

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

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

13
répondu Plantain Yao 2016-01-01 13:37:58

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

typings install --global es6-promise

12
répondu Nick Kenens 2016-06-23 10:14:54

A. Si vous utilisez "target": "es5" et la version TypeScript ci-dessous 2.0:

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

B. Si vous utilisez "target": "es5" et TypeScript version 2.0 ou higer:

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

C. Si vous utilisez "target": "es6", il n'y a pas besoin de faire quoi que ce soit.

6
répondu Vaz 2016-11-15 14:25:33

Utilisation de promesses ES6 natives avec Typescript dans Visual Studio 2015 + Node.outils js 1.2

Aucune installation npm requise car ES6 Promises est native.

Noeud.js projet -> Propriétés -> Tapuscrit onglet Construire 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
répondu Bibek Bhattacharya 2016-07-15 12:15:34

J'ai dû rétrograder @types/core-js à 9.36 pour le faire fonctionner avec "target": "es5" set dans mon tsconfig.

"@types/core-js": "0.9.36",

-1
répondu James 2017-04-27 08:33:48