Как использовать Typescript с родными обещаниями ES6



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

696   8  

8 ответов:

текущая библиотека.d.ts не имеет в нем определенных обещаний, поэтому вам нужен дополнительный файл определения для него, поэтому вы получаете ошибки компиляции.

вы могли бы, например, использовать (например, @elclanrs говорит) использовать пакет es6-promise с файлом определения из DefinitelyTyped:es6-promise definition

затем вы можете использовать его как это:

var p = new Promise<string>((resolve, reject) => { 
    resolve('a string'); 
});

edit вы можете использовать его без определения при таргетинге ES6 (с компилятором TypeScript) - обратите внимание, что вам все еще требуется обещание существовать во время выполнения курса (поэтому он не будет работать в старых браузерах :)) Добавьте / отредактируйте следующее в свой tsconfig.json:

"compilerOptions": {
    "target": "ES6"
}

edit 2 Когда TypeScript 2.0 выйдет, все немного изменится (хотя выше все еще работает), но файлы определения могут быть установлены непосредственно с npm, как показано ниже:

npm install --save @types/es6-promise -источник

edit3 Обновление ответ с дополнительной информацией для использования типов.

создать С { } как содержимое (если у вас нет пакета.уже джсон. Звоните npm install --save @types/es6-promise и tsc --init. Первая команда установки npm изменит ваш package.json включить es6-promise в качестве зависимости. tsc --init создаст tsconfig.json файл для вас.

теперь вы можете использовать обещание в вашем файле typescript var x: Promise<any>;. Выполнить tsc -p . для компиляции вашего проекта. У вас не должно быть ошибки.

Вариант № 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 для установки the es6-shim С типы организации.

npm install @types/es6-shim --save-dev

Альтернатива #3

Перед Машинописным Текстом 2.0, используйте typings установить es6-shim С DefinitelyTyped.

npm install typings --global --save-dev
typings install dt~es6-shim --global --save-dev

The typings параметр использует npm установить typings во всем мире, а затем использует typings для установки прокладки. Элемент dt~ префикс означает загрузить прокладку из DefinitelyTyped. Элемент --global опция означает, что типы прокладок будут доступны на протяжении всего проекта.

посмотреть также

https://github.com/Microsoft/TypeScript/issues/7788 - не удается найти имя 'Promise' & не удается найти имя 'require'

начиная с TypeScript 2.0 вы можете включить типизации для собственных обещаний, включив следующее в свой tsconfig.json

"compilerOptions": {
    "lib": ["es5", "es2015.promise"]
}

это будет включать объявления promise, которые поставляются с TypeScript без необходимости устанавливать цель на ES6.

Если вы используете узел.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

Это самый последний способ сделать это, приведенный выше ответ устарел:

typings install --global es6-promise

А. При использовании "target": "es5" и версия TypeScript ниже 2.0:

typings install es6-promise --save --global --source dt

Б. При использовании "target": "es5" и TypeScript версии 2.0 или выше:

"compilerOptions": {
    "lib": ["es5", "es2015.promise"]
}

C. Если используете "target": "es6", не нужно ничего делать.

использование собственных обещаний ES6 с Typescript в Visual Studio 2015 + Node.Яш инструменты 1.2

установка npm не требуется, поскольку обещания ES6 являются родными.

узел.проект Яш -> свойства -> вкладка сборки 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); 
    }
);

Я должен был понизить @types/core-js до 9.36, чтобы заставить его работать с "target": "es5" установить в моем tsconfig.

"@types/core-js": "0.9.36",

Comments

    Ничего не найдено.