TypescriptをネイティブES6プロミスで使用する方法


121

私はTypescriptの完全な初心者であり、TypescriptでES6のプロミスを使用することが可能かどうか、そしてそれを機能させるために何をしなければならないのか疑問に思っています。ノード0.11.14を実行していますが、コンパイル中に「名前「Promise」が見つかりません」というエラーが発生します。


1
es6-promise
Promise

回答:


128

現在のlib.d.tsには約束が定義されていないため、追加の定義ファイルが必要です。そのため、コンパイルエラーが発生します。

たとえば、(@ elclanrsが言うように)DefinitelyTypedの定義ファイルでes6-promiseパッケージを使用することができます:es6-promise定義

その後、次のように使用できます。

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

edit 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-promisetsc --init。最初のNPMは、コマンドをインストールし、あなたの変更されますpackage.json依存関係としてES6-約束を含めること。TSC --init作成するtsconfig.jsonファイルをあなたのために。

typescriptファイルでpromiseを使用できるようになりましたvar x: Promise<any>;。実行tsc -p .してプロジェクトをコンパイルします。エラーはないはずです。


5
ディック・ヴァン・デン・ブリンクに感謝します!tsdクエリの後に起動して実行es6-promise --action install --save
dchang

3
Typescript v1.7.xは、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の問題のようです...これに関するアイデアはありますか?すでにパッケージの復元/インストールを試みましたが、違いはありませんでした。
rumblefx0

2
こんにちは。ライブラリはコンパイル時にのみ使用されるため、の--save-dev代わりにフラグを使用する必要があると思います--save
mrr 2016

2
これは時代遅れです。ターゲットをES6に設定したり、typingsファイルをインストールしたりする必要はありません。以下の私の答えを参照してください。
paldepind 2017

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

NPMを使用es6-shimして、types組織からをインストールします。

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からシムをダウンロードすることを意味します。--globalシムの種類は、プロジェクト全体で利用できるようになりますオプションの手段。

こちらもご覧ください

https://github.com/Microsoft/TypeScript/issues/7788-名前「Promise」が見つからず、名前「require」が見つからない


2
es2016ターゲットがES2016をサポートしていない限り、含めることはお勧めできません。ES2016には、promiseをサポートするブラウザーが多数ありますが、すべてをサポートしているわけではありません。es2015.promiseES2016のすべての型を取り込むことなく、promiseの型のみを含めるために使用します。
paldepind 2017年

23

TypeScript 2.0以降、次のコードを含めることにより、ネイティブプロミスのタイプを含めることができます。 tsconfig.json

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

これには、ターゲットをES6に設定せずにTypeScriptに付属するpromise宣言が含まれます。


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 2016年

12

これを行う最新の方法です。上記の回答は古くなっています。

typings install --global es6-promise


タイピングはすでにかなり前から存在していますが、TypeScript 2.0では定義ファイルをnpmから直接インストールできます(タイピングのような追加のツールは必要ありません)。TypeScript 2.0が利用可能になるときの情報で私の投稿を更新しました。
Dick van den Brink

3
次のエラーを受け取ります。「es6-promise」をグローバルモジュールとしてコンパイルしようとしましたが、外部モジュールのように見えます。続行するには、グローバルオプションを削除する必要があります。
Shaun Luttin 16

最新の方法は次のとおりです。npminstall @ type / es6-promise --save
Berty

これはもはや最新の方法ではありません。TypeScriptにはPromiseのタイプが標準で付属しています。何もインストールする必要はありません。私の答えを見てください。
paldepind 2017年

5

Visual Studio 2015 + Node.jsツール1.2でTypescriptを使用してネイティブES6プロミスを使用する

ES6 Promiseはネイティブなので、npmのインストールは必要ありません。

Node.jsプロジェクト ->プロパティ-> 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); 
    }
);

5

A. "target": "es5"2.0未満のTypeScriptバージョンを使用している場合:

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

tsconfigのsetで@types/core-js動作させるには、9.36 にダウングレードする"target": "es5"必要がありました。

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.