Come utilizzare Typescript con promesse ES6 native


121

Sono un principiante assoluto di Typescript e mi chiedo se sia possibile utilizzare le promesse di ES6 in Typescript e cosa dovrei fare per farle funzionare. Sto eseguendo il nodo 0.11.14 e ricevo un errore durante la compilazione "Impossibile trovare il nome" Promise ""


1
Le promesse non sono ancora in Node, hai bisogno di un pacchetto, provaes6-promise
elclanrs

Risposte:


128

L'attuale lib.d.ts non ha promesse in esso definite, quindi è necessario un file di definizione aggiuntivo per questo motivo per cui si verificano errori di compilazione.

Ad esempio, potresti usare (come dice @elclanrs) usare il pacchetto es6-promise con il file di definizione da DefinitelyTyped: es6-promise definition

Puoi quindi usarlo in questo modo:

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

edit Puoi usarlo senza una definizione quando prendi di mira ES6 (con il compilatore TypeScript) - Nota che è comunque necessario che Promise esista nel runtime (quindi non funzionerà nei vecchi browser :)) Aggiungi / Modifica quanto segue al tuo tsconfig.json:

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

modifica 2 Quando uscirà TypeScript 2.0 le cose cambieranno un po '(anche se sopra funziona ancora) ma i file di definizione possono essere installati direttamente con npm come di seguito:

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

Edit3 Aggiornamento della risposta con maggiori informazioni per l'utilizzo dei tipi.

Crea un package.jsonfile con solo { }come contenuto (se non hai già un package.json. Chiama npm install --save @types/es6-promisee tsc --init. Il primo comando di installazione di npm cambierà il tuo package.jsonper includere es6-promise come dipendenza. Tsc --init creerà un tsconfig.jsonfile per te.

Ora puoi usare la promessa nel tuo file dattiloscritto var x: Promise<any>;. Esegui tsc -p .per compilare il tuo progetto. Non dovresti avere errori.


5
molte grazie Dick van den Brink! attivo e funzionante dopo una query tsd es6-promise --action install --save
dchang

3
nota che Typescript v1.7.x definisce il file di definizione della promessa es6 in C: \ Program Files (x86) \ Microsoft Visual Studio 12.0 \ Common7 \ IDE \ CommonExtensions \ Microsoft \ TypeScript \ lib.es6.d.ts
diegohb

2
Penso di avere lo stesso problema di @Kokodoko: il mio package.json è stato aggiornato dopo la prima istruzione, ma non viene rilevato da Intellisense (sto usando VS), si trasferisce e funziona anche se sembra un problema di VS Intellisense ... Qualche idea su questo? Ho già provato a ripristinare / installare pacchetti, ma non ha fatto la differenza.
rumblefx0

2
Ciao. Penso che il flag --save-devdovrebbe essere usato al posto di --save, poiché la libreria viene utilizzata solo in fase di compilazione.
signor

2
Questo è obsoleto. Non è necessario impostare la destinazione su ES6 né installare un file di battitura. Vedi la mia risposta di seguito.
paldepind

50

Alternativa n. 1

Usa le opzioni del compilatore targete libper compilare direttamente es5senza la necessità di installare il file es6-shim. (Testato con TypeScript 2.1.4). Nella sezione lib, usa o es2016o es2015.promise.

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

Alternativa n. 2

Utilizzare NPM installare il es6-shimdalla organizzazione tipi .

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

Alternativa n. 3

Prima di TypeScript 2.0, usa la digitazione per installare es6-shimglobalmente da DefinitelyTyped .

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

L' typingsopzione utilizza npmper installare typingsglobalmente e quindi utilizza typingsper installare lo shim. Il dt~prefisso significa scaricare lo shim da DefinitelyTyped. Il--global opzione significa che i tipi di shim saranno disponibili in tutto il progetto.

Guarda anche

https://github.com/Microsoft/TypeScript/issues/7788 - Impossibile trovare il nome "Promise" e Impossibile trovare il nome "require"


2
Includere es2016non è una buona idea a meno che il tuo obiettivo non supporti ES2016. Ci sono molti browser che supportano le promesse ma non tutto in ES2016. Utilizzare es2015.promiseper includere solo i tipi per le promesse senza inserire i tipi per tutto in ES2016.
paldepind

23

A partire da TypeScript 2.0 puoi includere digitazioni per promesse native includendo quanto segue nel tuo tsconfig.json

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

Ciò includerà le dichiarazioni di promessa fornite con TypeScript senza dover impostare la destinazione su ES6.


3
Questa è la risposta migliore, credo. Non richiede la modifica del target di compilazione o l'inserimento di tutte le tipizzazioni es2015.
Ethan

Questa è un'opzione quando supporti solo i nuovi browser. Se hai bisogno del supporto per IE10 o dispositivi Android precedenti, hai comunque bisogno di un polyfill.
Dick van den Brink

13

Se usi node.js 0.12 o successivo / typescript 1.4 o successivo, aggiungi semplicemente le opzioni del compilatore come:

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

Maggiori informazioni: https://github.com/Microsoft/TypeScript/wiki/Compiler-Options

Se usi tsconfig.json, allora in questo modo:

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

Maggiori informazioni: https://github.com/Microsoft/TypeScript/wiki/tsconfig.json


Non puoi effettivamente usare commonjs ed es6 insieme.
Adrian Ber

3
@AdrianBer In realtà puoi, le cose sono cambiate. github.com/Microsoft/TypeScript/wiki/…
Plantain Yao

questo non funzionerà se prevedi di supportare IE. Riceverai un "errore di sintassi" nel browser durante l'esecuzione.
RoninCoder

12

Questo è il modo più recente per farlo, la risposta di cui sopra è obsoleta:

typings install --global es6-promise


Le digitazioni esistono già da un po 'di tempo, ma TypeScript 2.0 consentirà l'installazione di file di definizione direttamente da npm (quindi non è necessario uno strumento aggiuntivo come la digitazione). Ho aggiornato il mio post con le informazioni quando TypeScript 2.0 sarà disponibile.
Dick van den Brink

3
Stiamo ricevendo il seguente errore: Tentativo di compilare "es6-promise" come modulo globale, ma sembra un modulo esterno. Dovrai rimuovere l'opzione globale per continuare.
Shaun Luttin

ora il modo più recente è: npm install @ type / es6-promise --save
Berty

Questa non è più la via più recente. TypeScript viene fornito con i tipi per Promises pronti all'uso. Non è necessario installare nulla. Vedi la mia risposta.
paldepind

5

Utilizzo delle promesse ES6 native con Typescript in Visual Studio 2015 + strumenti Node.js 1.2

Non è richiesta l'installazione di npm poiché ES6 Promises è nativo.

Progetto Node.js -> Proprietà -> scheda Build typescript Versione 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. Se si utilizza una "target": "es5"versione TypeScript precedente alla 2.0:

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

B. Se si utilizza "target": "es5"e TypeScript versione 2.0 o superiore:

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

C. Se si utilizza "target": "es6", non è necessario fare nulla.


4
Sto usando "target": "es6"con TypeScript 2.1.1 e sto ancora ottenendo Cannot find name 'Promise'.
zakdances

-1

Ho dovuto eseguire il downgrade @types/core-jsa 9.36 per farlo funzionare con "target": "es5"set nel mio tsconfig.

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

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.