Odpowiedzi:
Obecny lib.d.ts nie ma zdefiniowanych obietnic, więc potrzebujesz do tego dodatkowego pliku definicji, dlatego otrzymujesz błędy kompilacji.
Możesz na przykład użyć (jak mówi @elclanrs) użyć pakietu es6-promise z plikiem definicji z DefinitelyTyped: definicja es6-promise
Następnie możesz go użyć w następujący sposób:
var p = new Promise<string>((resolve, reject) => {
resolve('a string');
});
edytuj Możesz go używać bez definicji podczas kierowania na ES6 (za pomocą kompilatora TypeScript) - Pamiętaj, że nadal potrzebujesz, aby Promise istniała w czasie wykonywania (więc nie będzie działać w starych przeglądarkach :)) Dodaj / Edytuj następujące tsconfig.json
:
"compilerOptions": {
"target": "ES6"
}
edit 2 Kiedy pojawi się TypeScript 2.0, sytuacja trochę się zmieni (choć powyżej nadal działa), ale pliki definicji można zainstalować bezpośrednio za pomocą npm, jak poniżej:
npm install --save @types/es6-promise
- źródło
edit3 Aktualizacja odpowiedzi o więcej informacji o używaniu typów.
Utwórz package.json
plik tylko { }
z zawartością (jeśli nie masz jeszcze pliku package.json. Wywołaj npm install --save @types/es6-promise
i tsc --init
. Pierwsze polecenie instalacji npm zmieni twoje, package.json
aby uwzględnić es6-promise jako zależność. Tsc --init utworzy tsconfig.json
plik dla Ciebie.
Możesz teraz użyć obietnicy w swoim pliku maszynopisu var x: Promise<any>;
. Wykonaj, tsc -p .
aby skompilować swój projekt. Nie powinieneś mieć żadnych błędów.
--save-dev
zamiast flagi należy użyć flagi --save
, ponieważ biblioteka jest używana tylko w czasie kompilacji.
Użyj opcji kompilatora target
i, lib
aby skompilować bezpośrednio do es5
bez konieczności instalowania es6-shim
. (Testowane za pomocą TypeScript 2.1.4
). W sekcji lib użyj es2016
lub es2015.promise
.
// tsconfig.json
{
"compilerOptions": {
"target": "es5",
"lib": [
"es2015.promise",
"dom"
]
},
"include": [
"src/**/*.ts"
],
"exclude": [
"node_modules"
]
}
Użyj NPM, aby zainstalować organizację es6-shim
z typów .
npm install @types/es6-shim --save-dev
Przed TypeScript 2.0 użyj typów, aby zainstalować es6-shim
globalnie z DefinitelyTyped .
npm install typings --global --save-dev
typings install dt~es6-shim --global --save-dev
Ta typings
opcja używa npm
do instalacji typings
globalnej, a następnie używa typings
do zainstalowania podkładki. dt~
Prefiks oznacza ściągnąć podkładkę z DefinitelyTyped. Ta --global
opcja oznacza, że typy podkładek będą dostępne w całym projekcie.
https://github.com/Microsoft/TypeScript/issues/7788 - Nie można znaleźć nazwy „Obietnica” i nie można znaleźć nazwy „Wymagaj”
es2016
nie jest dobrym pomysłem, chyba że twój cel obsługuje ES2016. Jest wiele przeglądarek, które obsługują obietnice, ale nie wszystkie w ES2016. Służy es2015.promise
do włączania tylko typów obietnic bez pobierania typów dla wszystkiego w ES2016.
Począwszy od TypeScript 2.0, możesz uwzględnić typy dla natywnych obietnic, dołączając następujące elementy do pliku tsconfig.json
"compilerOptions": {
"lib": ["es5", "es2015.promise"]
}
Obejmuje to deklaracje obietnicy, które są dostarczane z TypeScript bez konieczności ustawiania celu na ES6.
Jeśli używasz node.js 0.12 lub nowszego / typescript 1.4 lub nowszego, po prostu dodaj opcje kompilatora, takie jak:
tsc a.ts --target es6 --module commonjs
Więcej informacji: https://github.com/Microsoft/TypeScript/wiki/Compiler-Options
Jeśli używasz tsconfig.json
, to w ten sposób:
{
"compilerOptions": {
"module": "commonjs",
"target": "es6"
}
}
Więcej informacji: https://github.com/Microsoft/TypeScript/wiki/tsconfig.json
To najnowszy sposób, aby to zrobić, powyższa odpowiedź jest nieaktualna:
typings install --global es6-promise
Nie jest wymagana instalacja npm, ponieważ ES6 Promises jest natywna.
Projekt Node.js -> Właściwości -> karta Budowanie skryptu Typescript Wersja 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);
}
);
A. Jeśli używasz "target": "es5"
i wersji TypeScript poniżej 2.0:
typings install es6-promise --save --global --source dt
B. Jeśli używasz "target": "es5"
i TypeScript w wersji 2.0 lub nowszej:
"compilerOptions": {
"lib": ["es5", "es2015.promise"]
}
C. Jeśli używasz "target": "es6"
, nie musisz nic robić.
"target": "es6"
z TypeScript 2.1.1 i nadal otrzymuję Cannot find name 'Promise'
.
es6-promise