Як користуватися Typescript з нативними обіцянками ES6


121

Я є початківець для Typescript і мені цікаво, чи можна використовувати обіцянки ES6 в Typescript і що я повинен зробити, щоб змусити їх працювати. Я запускаю вузол 0.11.14 і отримую помилку під час компіляції "Неможливо знайти ім'я" Обіцяти ""


1
Обіцянь ще немає у Вузлі, вам потрібен пакет, спробуйтеes6-promise
elclanrs

Відповіді:


128

У поточному 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 .щоб скласти свій проект. У вас не повинно бути помилок.


5
дякую Діку ван ден Брінку! запущений і запущений після запиту tsd es6-обіцянка - установка дії --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 - мій пакунок.json оновлювався після першої заяви, але його Intellisense (я використовую VS) не отримував, він перекладає та працює, хоча так здається, що проблема VS Intellisense ... Будь-які ідеї з цього приводу? Я вже спробував відновити / встановити пакети, але нічого не змінило.
rumblefx0

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глобально з 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 - Не вдається знайти ім’я "Обіцяти" та не можу знайти ім'я "вимагати"


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 або вище / 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


Насправді ви не можете використовувати 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-promis" як глобальний модуль, але це виглядає як зовнішній модуль. Вам потрібно буде видалити глобальну опцію, щоб продовжити.
Shaun Luttin

Тепер самий останній спосіб: НПМ встановити @ типу / ES6-обіцянку --save
Берті

Це вже не самий останній спосіб. TypeScript поставляється з типами для Обіцянь поза коробкою. Не потрібно нічого встановлювати. Дивіться мою відповідь.
paldepind

5

Використання нативної обіцянки ES6 з Typescript у Visual Studio 2015 + інструменти Node.js 1.2

Не потрібно встановлювати 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); 
    }
);

5

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", не потрібно нічого робити.


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.