簡體   English   中英

如何在原生 ES6 Promise 中使用 Typescript

[英]How to use Typescript with native ES6 Promises

我是一個完整的 Typescript 初學者,想知道是否可以在 Typescript 中使用 ES6 承諾,以及我必須做些什么才能讓它們工作。 我正在運行節點 0.11.14 並且在編譯過程中出現錯誤“找不到名稱 'Promise'”

當前的 lib.d.ts 中沒有定義 promise,因此您需要一個額外的定義文件,這就是為什么會出現編譯錯誤的原因。

例如,您可以使用(如@elclanrs 所說)將 es6-promise 包與來自絕對類型的定義文件一起使用: es6-promise 定義

然后你可以像這樣使用它:

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-promisetsc --init 。第一個 npm install 命令將更改package.json以包含 es6-promise 作為依賴項。tsc --init 將為您創建一個tsconfig.json文件。

您現在可以在打字稿文件var x: Promise<any>;使用承諾var x: Promise<any>; . 執行tsc -p . 編譯你的項目。 你應該沒有錯誤。

替代方案#1

使用targetlib編譯器選項直接編譯為es5無需安裝es6-shim (使用 TypeScript 2.1.4測試)。 在 lib 部分,使用es2016es2015.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

打字稿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 下載shim。 --global選項意味着墊片的類型將在整個項目中可用。

也可以看看

https://github.com/Microsoft/TypeScript/issues/7788 - 找不到名稱 'Promise' 和找不到名稱 'require'

從 TypeScript 2.0 開始,您可以通過在tsconfig.json包含以下內容來包含本機承諾的tsconfig.json

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

這將包括 TypeScript 附帶的承諾聲明,而無需將目標設置為 ES6。

如果您使用 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

這是最近的方法,上面的答案已經過時了:

typings install --global es6-promise

在 Visual Studio 2015 + Node.js 工具 1.2 中使用帶有 Typescript 的原生 ES6 Promises

不需要 npm install 因為 ES6 Promises 是原生的。

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); 
    }
);

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" ,則無需執行任何操作。

我不得不將@types/core-js降級到 9.36 才能讓它與我的 tsconfig 中設置的"target": "es5"一起工作。

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

tsconfig.json 中的 typeorm 問題,添加以下屬性:"strictPropertyInitialization": false

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM