如何在本地ES6 Promises中使用Typescript


121

我是Typescript的完整入门者,想知道在Typescript中是否可以使用ES6 Promise,以及如何使它们起作用。我正在运行节点0.11.14,并且在编译过程中出现错误“找不到名称'Promise'”


1
es6-promise
Promise

Answers:


128

当前的lib.d.ts没有定义promise,因此您需要一个额外的定义文件,这就是为什么您遇到编译错误的原因。

例如,您可以使用es6-promise包(与@elclanrs一样)与DefinitelyTyped中的定义文件一起使用:es6-promise definition

然后可以像这样使用它:

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文件为了你。

现在,您可以在打字稿文件中使用Promise var x: Promise<any>;。执行tsc -p .以编译您的项目。您应该没有错误。


5
非常感谢Dick van den Brink!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
这已经过时了。您不必将target设置为ES6或安装类型文件。请参阅下面的答案。
paldepind

50

选择#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下载垫片。该--global选项意味着在整个项目中都可以使用垫片的类型。

也可以看看

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


2
es2016除非您的目标支持ES2016,否则包含一个好主意。有许多浏览器支持promise,但ES2016中不支持所有功能。用于es2015.promise仅包含promise的类型,而无需拉入ES2016中所有内容的类型。
paldepind

23

从TypeScript 2.0开始,您可以通过在您的脚本中包含以下内容来为本地Promise键入内容 tsconfig.json

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

这将包括TypeScript随附的promise声明,而不必将目标设置为ES6。


3
我认为这是最好的答案。不需要更改编译目标或引入所有es2015类型。
伊桑(Ethan)

当您仅支持新的浏览器时,这是一个选项。如果您需要IE10或更旧的android设备支持,则仍然需要使用polyfill。
Dick van den Brink

13

如果您使用的是node.js 0.12或更高版本/打字稿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可用时,用信息更新了我的帖子。
Dick van den Brink

3
我们收到以下错误:尝试将“ es6-promise”编译为全局模块,但看起来像一个外部模块。您需要删除全局选项才能继续。
Shaun Luttin '16

现在最新的方式是:npm install @ type / es6-promise --save
Berty

这不再是最新的方式。TypeScript提供了Promises的类型。无需安装任何东西。看我的答案。
paldepind

5

在Visual Studio 2015 + Node.js工具1.2中将原生ES6 Promises与Typescript一起使用

无需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"低于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

我必须降级@types/core-js到9.36才能使其与"target": "es5"tsconfig中的set一起使用。

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.