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


121

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


1
Обещаний еще нет в Node, вам нужен пакет, попробуйтеes6-promise
elclanrs

Ответы:


128

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

Вы можете, например, использовать (как говорит @elclanrs) использовать пакет es6-prom с файлом определения из ОпределенноТипед: определение es6-обещания

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

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

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

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

edit 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файл для тебя.

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


5
Большое спасибо Дику ван ден Бринку! запускается и работает после запроса tsd es6-prom --action install --save
dchang

3
обратите внимание, что Typescript v1.7.x определяет файл определения обещания es6 в C: \ Program Files (x86) \ Microsoft Visual Studio 12.0 \ Common7 \ IDE \ CommonExtensions \ Microsoft \ TypeScript \ lib.es6.d.ts
diegohb

2
Я думаю, что у меня та же проблема, что и у @Kokodoko - мой package.json был обновлен после первого оператора, но его не забирает Intellisense (я использую VS), он переносится и запускается, хотя это похоже на проблему VS Intellisense ... Есть идеи по этому поводу? Я уже пробовал восстанавливать / устанавливать пакеты, но без разницы.
roublefx0

2
Привет. Я думаю, что --save-devвместо этого следует использовать флаг --save, поскольку библиотека используется только во время компиляции.
MRR

2
Это устарело. Вам не нужно устанавливать цель на ES6 или устанавливать файл типизации. Смотрите мой ответ ниже.
paldepind

50

Альтернатива # 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

Используйте НПМ для установкиes6-shim из типов организации .

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

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

До TypeScript 2.0 используйте типизацию, чтобы установить es6-shimглобально из Определенного Типа .

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 - Не удается найти имя «Обещание» и не удается найти имя «Требовать»


2
Включение es2016- не лучшая идея, если ваша цель не поддерживает ES2016. Многие браузеры поддерживают обещания, но не все в ES2016. Используйте, es2015.promiseчтобы включать только типы для обещаний, не втягивая типы для всего в ES2016.
paldepind

23

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

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

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


3
Думаю, это лучший ответ. Это не требует изменения целевого объекта компиляции или ввода всех типов es2015.
Итан

Это вариант, когда вы поддерживаете только новые браузеры. Если вам требуется поддержка IE10 или более старых устройств Android, вам все равно понадобится полифилл.
Дик ван ден Бринк

13

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


На самом деле вы не можете использовать commonjs и es6 вместе.
Адриан Бер

3
@AdrianBer На самом деле, все изменилось. github.com/Microsoft/TypeScript/wiki/…
Подорожник Яо

это не сработает, если вы планируете поддерживать IE. При запуске в браузере появится «синтаксическая ошибка».
RoninCoder

12

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

typings install --global es6-promise


Типизации уже существуют довольно давно, но TypeScript 2.0 позволит устанавливать файлы определений непосредственно из npm (поэтому вам не нужен дополнительный инструмент, такой как набор текста). Обновил мой пост информацией, когда TypeScript 2.0 станет доступен.
Дик ван ден Бринк,

3
Мы получаем следующую ошибку: Попытка скомпилировать "es6-prom" как глобальный модуль, но он выглядит как внешний модуль. Чтобы продолжить, вам нужно удалить глобальный параметр.
Shaun Luttin 05

теперь самый последний способ: npm install @ type / es6-prom --save
Берти

Это уже не самый последний способ. TypeScript поставляется с типами для обещаний из коробки. Устанавливать ничего не нужно. Смотрите мой ответ.
paldepind

5

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

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

Проект Node.js -> Свойства -> вкладка Typescript Build Версия 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); 
    }
);

5

A. При использовании "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"ничего делать не нужно.


4
Я использую "target": "es6"TypeScript 2.1.1 и все еще получаю Cannot find name 'Promise'.
zakdances

-1

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

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

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.