Відповіді:
У поточному lib.d.ts не визначено жодних обіцянок, тому вам потрібен файл додаткового визначення для нього, тому ви отримуєте помилки компіляції.
Ви можете, наприклад, використовувати (як @elclanrs каже) використовувати пакунок es6-promis з файлом визначення з Defin DefinTyped :
Потім ви можете використовувати його так:
var p = new Promise<string>((resolve, reject) => {
resolve('a string');
});
редагування Ви можете використовувати його без визначення під час націлення на ES6 (за допомогою компілятора TypeScript) - Зауважте, що ви все одно вимагаєте, щоб Обіцяння існувало під час виконання курсу (щоб він не працював у старих браузерах :)) Додайте / редагуйте наступне у свій tsconfig.json
:
"compilerOptions": {
"target": "ES6"
}
редагувати 2 Коли з'явиться TypeScript 2.0, речі трохи зміняться (хоча вище все ще працює), але файли визначення можуть бути встановлені безпосередньо з npm, як нижче:
npm install --save @types/es6-promise
- джерело
редагувати3 Оновлення відповіді з додатковою інформацією щодо використання типів.
Створіть package.json
файл лише { }
як вміст (якщо у вас вже не є пакет.json. Виклик npm install --save @types/es6-promise
і tsc --init
. Перша команда npm install змінить вашу package.json
функцію включити es6-обіцянку як залежність. Tsc --init створить tsconfig.json
файл для вас.
Тепер ви можете використовувати обіцянку у вашому файлі машинопису var x: Promise<any>;
. Виконати, tsc -p .
щоб скласти свій проект. У вас не повинно бути помилок.
--save-dev
слід використовувати замість --save
, оскільки бібліотека використовується лише під час компіляції.
Використовуйте параметри target
і lib
компілятор для компіляції безпосередньо es5
без необхідності встановлення es6-shim
. (Випробувано за допомогою TypeScript 2.1.4
). У розділі lib використовуйте es2016
або es2015.promise
.
// tsconfig.json
{
"compilerOptions": {
"target": "es5",
"lib": [
"es2015.promise",
"dom"
]
},
"include": [
"src/**/*.ts"
],
"exclude": [
"node_modules"
]
}
Використовуйте НПМ для установкиes6-shim
з типів організації .
npm install @types/es6-shim --save-dev
Перед TypeScript 2.0 використовуйте типізацію, щоб встановити es6-shim
глобально з DefinitelyTyped .
npm install typings --global --save-dev
typings install dt~es6-shim --global --save-dev
Цей typings
параметр використовує npm
для встановлення typings
глобально, а потім використовує typings
для установки шим. dt~
Префікс означає для завантаження підкладки з DefinitelyTyped. The--global
означає варіант , що типи прокладки будуть доступні на протязі всього проекту.
https://github.com/Microsoft/TypeScript/isissue/7788 - Не вдається знайти ім’я "Обіцяти" та не можу знайти ім'я "вимагати"
es2016
не є хорошою ідеєю, якщо ваша ціль не підтримує ES2016. У ES2016 існує багато браузерів, які підтримують обіцянки, але не все. Використовуйте es2015.promise
для включення лише типів для обіцянок, не втягуючи типи для всього в ES2016.
Станом на TypeScript 2.0 ви можете включати типізації для власних обіцянок, включивши в своє tsconfig.json
"compilerOptions": {
"lib": ["es5", "es2015.promise"]
}
Сюди ввійдуть декларації обіцянок, що надходять із TypeScript, не встановлюючи цільовий показник на ES6.
Якщо ви використовуєте node.js 0,12 або вище / typecript 1.4 або вище, просто додайте такі параметри компілятора, як:
tsc a.ts --target es6 --module commonjs
Більше інформації: https://github.com/Microsoft/TypeScript/wiki/Compiler-Options
Якщо ви використовуєте tsconfig.json
, то так:
{
"compilerOptions": {
"module": "commonjs",
"target": "es6"
}
}
Детальніше: https://github.com/Microsoft/TypeScript/wiki/tsconfig.json
Це самий останній спосіб зробити це, наведена вище відповідь застаріла:
typings install --global es6-promise
Не потрібно встановлювати npm, оскільки ES6 Promises є рідним.
Проект Node.js -> Властивості -> Вкладка збірки типових скриптів Версія 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. Якщо використовується "target": "es5"
та версія TypeScript нижче 2.0:
typings install es6-promise --save --global --source dt
B. Якщо використовується "target": "es5"
та TypeScript версії 2.0 або вище:
"compilerOptions": {
"lib": ["es5", "es2015.promise"]
}
C. Якщо ви користуєтесь "target": "es6"
, не потрібно нічого робити.
"target": "es6"
TypeScript 2.1.1, і я все ще отримую Cannot find name 'Promise'
.
es6-promise