Как использовать Typescript с родным ES6 Promises

Я начинаю начинать с Typescript и задаюсь вопросом, можно ли использовать ES6 promises в Typescript и что мне нужно сделать, чтобы заставить их работать. Я запускаю node 0.11.14 и получаю сообщение об ошибке во время компиляции "Не могу найти имя" Обещание "

Ответ 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'