Verwendung von Typescript mit nativen ES6-Versprechungen

121

Ich bin ein absoluter Anfänger in Typescript und frage mich, ob es möglich ist, ES6-Versprechen in Typescript zu verwenden und was ich tun müsste, um sie zum Laufen zu bringen. Ich verwende den Knoten 0.11.14 und erhalte während der Kompilierung die Fehlermeldung "Name 'Versprechen' kann nicht gefunden werden"

dchang
quelle
1
Versprechen sind noch nicht in Node, Sie brauchen ein Paket, versuchen Siees6-promise
elclanrs

Antworten:

128

In der aktuellen lib.d.ts sind keine Versprechen definiert, daher benötigen Sie eine zusätzliche Definitionsdatei, weshalb Kompilierungsfehler auftreten.

Sie könnten beispielsweise (wie @elclanrs sagt) das es6-Versprechen-Paket mit der Definitionsdatei von DefinitelyTyped: es6-Versprechen-Definition verwenden

Sie können es dann folgendermaßen verwenden:

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

Bearbeiten Sie können es ohne Definition verwenden, wenn Sie auf ES6 abzielen (mit dem TypeScript-Compiler). - Beachten Sie, dass das Versprechen zur Laufzeit natürlich noch vorhanden sein muss (damit es in alten Browsern nicht funktioniert :)) tsconfig.json::

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

edit 2 Wenn TypeScript 2.0 herauskommt, ändern sich die Dinge ein wenig (obwohl oben noch funktioniert), aber Definitionsdateien können direkt mit npm wie unten installiert werden:

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

edit3 Antwort mit weiteren Informationen zur Verwendung der Typen aktualisieren.

Erstellen Sie eine package.jsonDatei nur { }mit dem Inhalt (wenn Sie noch keine package.json haben. Rufen Sie npm install --save @types/es6-promiseund auf tsc --init. Mit dem ersten Befehl zur Installation von npm wird Ihr Befehl geändert package.json, um das es6-Versprechen als Abhängigkeit einzuschließen. Tsc --init erstellt eine tsconfig.jsonDatei für dich.

Sie können das Versprechen jetzt in Ihrer Typoskriptdatei verwenden var x: Promise<any>;. Ausführen tsc -p ., um Ihr Projekt zu kompilieren. Sie sollten keine Fehler haben.

Dick van den Brink
quelle
5
Vielen Dank Dick van den Brink! betriebsbereit nach einer tsd-abfrage es6-versprechen --action install --save
dchang
3
Beachten Sie, dass Typescript v1.7.x die es6-Versprechen-Definitionsdatei unter C: \ Programme (x86) \ Microsoft Visual Studio 12.0 \ Common7 \ IDE \ CommonExtensions \ Microsoft \ TypeScript \ lib.es6.d.ts
diegohb
2
Ich glaube, ich habe das gleiche Problem wie @Kokodoko - mein package.json wurde nach der ersten Anweisung aktualisiert, aber es wird nicht von Intellisense aufgenommen (ich verwende VS), es transpiliert und läuft, obwohl es wie ein VS Intellisense-Problem erscheint ... irgendwelche Ideen dazu? Ich habe bereits versucht, Pakete wiederherzustellen / zu installieren, aber keinen Unterschied gemacht.
rumblefx0
2
Hallo. Ich denke, das Flag --save-devsollte anstelle von verwendet werden --save, da die Bibliothek nur zur Kompilierungszeit verwendet wird.
Herr
2
Das ist veraltet. Sie müssen weder das Ziel auf ES6 setzen noch eine Typisierungsdatei installieren. Siehe meine Antwort unten.
Paldepind
50

Alternative Nr. 1

Verwenden Sie die Optionen targetund libcompiler, um direkt zu kompilieren, es5ohne die installieren zu müssen es6-shim. (Getestet mit TypeScript 2.1.4). Verwenden Sie im Abschnitt lib entweder es2016oder es2015.promise.

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

Alternative Nr. 2

Verwenden Sie NPM, um die Organisationes6-shim aus dem Typ zu installieren .

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

Alternative Nr. 3

Verwenden Sie vor TypeScript 2.0 Typisierungen , um das es6-shimglobal von DefinitelyTyped zu installieren .

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

Die typingsOption wird npmzur typingsglobalen Installation und dann typingszur Installation des Shims verwendet. Das dt~Präfix bedeutet, dass der Shim von DefinitelyTyped heruntergeladen wird. Das--global Option bedeutet, dass die Shim-Typen während des gesamten Projekts verfügbar sind.

Siehe auch

https://github.com/Microsoft/TypeScript/issues/7788 - Der Name "Versprechen" und der Name "Erforderlich" können nicht gefunden werden.

Shaun Luttin
quelle
2
Das Einschließen es2016ist keine gute Idee, es sei denn, Ihr Ziel unterstützt ES2016. Es gibt viele Browser, die Versprechen unterstützen, aber nicht alles in ES2016. Verwenden Sie es2015.promisediese Option, um nur die Typen für Versprechen einzuschließen, ohne Typen für alles in ES2016 einzuziehen.
Paldepind
23

Ab TypeScript 2.0 können Sie Typisierungen für native Versprechen einschließen, indem Sie Folgendes in Ihre Liste aufnehmen tsconfig.json

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

Dies schließt die mit TypeScript gelieferten Versprechen ein, ohne dass das Ziel auf ES6 festgelegt werden muss.

Paldepind
quelle
3
Das ist die beste Antwort, denke ich. Es ist nicht erforderlich, das Kompilierungsziel zu ändern oder alle es2015-Typisierungen einzubringen.
Ethan
Dies ist eine Option, wenn Sie nur neue Browser unterstützen. Wenn Sie Unterstützung für IE10 oder ältere Android-Geräte benötigen, benötigen Sie immer noch eine Polyfüllung.
Dick van den Brink
13

Wenn Sie node.js 0.12 oder höher / typescript 1.4 oder höher verwenden, fügen Sie einfach Compileroptionen hinzu wie:

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

Weitere Informationen: https://github.com/Microsoft/TypeScript/wiki/Compiler-Options

Wenn Sie verwenden tsconfig.json, dann wie folgt:

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

Weitere Informationen: https://github.com/Microsoft/TypeScript/wiki/tsconfig.json

Wegerich Yao
quelle
Sie können commonjs und es6 nicht zusammen verwenden.
Adrian Ber
3
@AdrianBer Eigentlich kannst du, Dinge haben sich geändert. github.com/Microsoft/TypeScript/wiki/…
Wegerich Yao
Dies funktioniert nicht, wenn Sie den IE unterstützen möchten. Beim Ausführen des Browsers wird ein Syntaxfehler angezeigt.
RoninCoder
12

Dies ist der jüngste Weg, um dies zu tun. Die obige Antwort ist veraltet:

typings install --global es6-promise

Nick Kenens
quelle
Typisierungen gibt es bereits seit einiger Zeit, aber mit TypeScript 2.0 können Definitionsdateien direkt von npm installiert werden (Sie benötigen also kein zusätzliches Tool wie Typisierungen). Mein Beitrag wurde mit Informationen aktualisiert, wann TypeScript 2.0 verfügbar sein wird.
Dick van den Brink
3
Wir erhalten die folgende Fehlermeldung: Es wurde versucht, "es6-versprechen" als globales Modul zu kompilieren, aber es sieht aus wie ein externes Modul. Sie müssen die globale Option entfernen, um fortzufahren.
Shaun Luttin
Jetzt ist der neueste Weg: npm install @ type / es6-versprechen --save
Berty
Dies ist nicht mehr der neueste Weg. TypeScript wird standardmäßig mit Typen für Versprechen geliefert. Es ist nicht erforderlich, etwas zu installieren. Siehe meine Antwort.
Paldepind
5

Verwenden nativer ES6-Versprechen mit Typescript in Visual Studio 2015 + Node.js-Tools 1.2

Keine npm-Installation erforderlich, da ES6 Promises nativ ist.

Node.js-Projekt -> Eigenschaften -> Registerkarte Typescript Build ECMAScript version = 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); 
    }
);
Bibek Bhattacharya
quelle
5

A. Wenn Sie eine "target": "es5"TypeScript-Version unter 2.0 verwenden:

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

B. Wenn Sie "target": "es5"TypeScript Version 2.0 oder höher verwenden:

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

C. Wenn Sie verwenden "target": "es6", müssen Sie nichts tun.

Vaz
quelle
4
Ich verwende "target": "es6"mit TypeScript 2.1.1 und bekomme immer noch Cannot find name 'Promise'.
Zakdances
-1

Ich musste ein Downgrade @types/core-jsauf 9.36 durchführen, damit es mit "target": "es5"set in meiner tsconfig funktioniert.

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

James
quelle