Risposte:
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.json
file con solo { }
come contenuto (se non hai già un package.json. Chiama npm install --save @types/es6-promise
e tsc --init
. Il primo comando di installazione di npm cambierà il tuo package.json
per includere es6-promise come dipendenza. Tsc --init creerà un tsconfig.json
file 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.
--save-dev
dovrebbe essere usato al posto di --save
, poiché la libreria viene utilizzata solo in fase di compilazione.
Usa le opzioni del compilatore target
e lib
per compilare direttamente es5
senza la necessità di installare il file es6-shim
. (Testato con TypeScript 2.1.4
). Nella sezione lib, usa o es2016
o es2015.promise
.
// tsconfig.json
{
"compilerOptions": {
"target": "es5",
"lib": [
"es2015.promise",
"dom"
]
},
"include": [
"src/**/*.ts"
],
"exclude": [
"node_modules"
]
}
Utilizzare NPM installare il es6-shim
dalla organizzazione tipi .
npm install @types/es6-shim --save-dev
Prima di TypeScript 2.0, usa la digitazione per installare es6-shim
globalmente da DefinitelyTyped .
npm install typings --global --save-dev
typings install dt~es6-shim --global --save-dev
L' typings
opzione utilizza npm
per installare typings
globalmente e quindi utilizza typings
per 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.
https://github.com/Microsoft/TypeScript/issues/7788 - Impossibile trovare il nome "Promise" e Impossibile trovare il nome "require"
es2016
non è 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.promise
per includere solo i tipi per le promesse senza inserire i tipi per tutto in ES2016.
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.
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
Questo è il modo più recente per farlo, la risposta di cui sopra è obsoleta:
typings install --global es6-promise
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);
}
);
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.
"target": "es6"
con TypeScript 2.1.1 e sto ancora ottenendo Cannot find name 'Promise'
.
es6-promise