Я начинаю начинать с Typescript и задаюсь вопросом, можно ли использовать ES6 promises в Typescript и что мне нужно сделать, чтобы заставить их работать. Я запускаю node 0.11.14 и получаю сообщение об ошибке во время компиляции "Не могу найти имя" Обещание "
Как использовать Typescript с родным ES6 Promises
Ответ 1
В текущем lib.d.ts не указано promises, поэтому вам нужен дополнительный файл определения, поэтому вы получаете ошибки компиляции.
Например, вы можете использовать (например, @elclanrs) использовать пакет es6-prom с файлом определения из DefinitelyTyped: определение es6-prom
Затем вы можете использовать его следующим образом:
var p = new Promise<string>((resolve, reject) => {
resolve('a string');
});
изменить. Вы можете использовать его без определения при таргетинге на ES6 (с помощью компилятора TypeScript). Обратите внимание, что по-прежнему требуется, чтобы Promise существовала во время выполнения курса (поэтому он не будет работать в старые браузеры:))
Добавьте/измените следующее на tsconfig.json
:
"compilerOptions": {
"target": "ES6"
}
изменить 2 Когда выйдет TypeScript 2.0, все изменится немного (хотя выше все еще работает), но файлы определения могут быть установлены непосредственно с npm, как показано ниже:
npm install --save @types/es6-promise
- источник
Edit3 Обновление ответа с дополнительной информацией для использования типов.
Создайте файл package.json
только с { }
в качестве содержимого (если у вас уже нет package.json.
Вызовите npm install --save @types/es6-promise
и tsc --init
. Первая команда установки npm изменит ваш package.json
, чтобы включить es6-prom в качестве зависимости. tsc --init создаст для вас файл tsconfig.json
.
Теперь вы можете использовать обещание в своем TypeScript файле var x: Promise<any>;
.
Выполните tsc -p .
, чтобы скомпилировать ваш проект. У вас не должно быть ошибок.
Ответ 2
Альтернатива # 1
Используйте параметры компилятора 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"
]
}
Альтернатива # 2
Используйте NPM для установки es6-shim
из типов организация.
npm install @types/es6-shim --save-dev
Альтернатива № 3
До TypeScript 2.0 используйте typings, чтобы установить es6-shim
глобально из DefinitelyTyped.
npm install typings --global --save-dev
typings install dt~es6-shim --global --save-dev
Опция typings
использует npm
для установки typings
глобально, а затем использует typings
для установки прокладки. Префикс dt~
означает загрузку прокладки из DefinitelyTyped. Опция --global
означает, что типы прокладок будут доступны во всем проекте.
См. также
https://github.com/Microsoft/TypeScript/issues/7788 - Не удается найти имя "Promise" и не может найти имя "require"
Ответ 3
Если вы используете node.js 0.12 или выше /typescript 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
Ответ 4
Это самый последний способ сделать это, вышеупомянутый ответ устарел:
typings install --global es6-promise
Ответ 5
Как и в случае с TypeScript 2.0, вы можете включить типизацию для native promises, включив в свой tsconfig.json
"compilerOptions": {
"lib": ["es5", "es2015.promise"]
}
Это будет включать объявления обещаний, которые поставляются с TypeScript без необходимости устанавливать цель на ES6.
Ответ 6
Использование собственного ES6 Promises с Typescript в Visual Studio 2015 + Node.js tools 1.2
Нет необходимости установки npm, поскольку ES6 Promises является родным.
Node.js project → Свойства → Typescript Вкладка сборки Версия 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);
}
);
Ответ 7
а. При использовании "target": "es5"
и TypeScript версии ниже 2.0:
typings install es6-promise --save --global --source dt
В. При использовании "target": "es5"
и TypeScript версии 2.0 или более высокого уровня:
"compilerOptions": {
"lib": ["es5", "es2015.promise"]
}
С. Если вы используете "target": "es6"
, ничего не нужно делать.
Ответ 8
Если у вас есть проект angular 2 CLI, который вы просто делаете: npm install --save @types/es6-promise
, и вам хорошо идти. Это относительно новое изменение (на сегодняшний день 1 октябрь 2016) и является рекомендуемым способом для добавления типов.
Но убедитесь, что у вас tsconfig.json
:
compilerOptions: {
......
"typeRoots": [
"../node_modules/@types" // here is the recommended place to add types now..
]
}
Ответ 9
Мне пришлось понизить @types/core-js
до 9.36, чтобы заставить его работать с "target": "es5"
, установленным в моем tsconfig.
"@types/core-js": "0.9.36",
Ответ 10
Для меня я просто сделал
import { promise } from 'protractor'