如何使用Nativecript与本机ES6 Promises

dch*_*ang 121 javascript typescript es6-promise

我是Typescript的完全初学者,我想知道是否可以在Typescript中使用ES6承诺以及我必须做些什么才能让它们起作用.我正在运行节点0.11.14并在编译期间收到错误"无法找到名称'承诺'"

Dic*_*ink 126

当前的lib.d.ts中没有定义的promise,所以你需要一个额外的定义文件,这就是你得到编译错误的原因.

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

然后你可以像这样使用它:

var p = new Promise<string>((resolve, reject) => { 
    resolve('a string'); 
});
Run Code Online (Sandbox Code Playgroud)

编辑你可以在没有定义的情况下使用它来定位ES6(使用TypeScript编译器) - 注意你仍然需要Promise存在于运行时的课程中(所以它在旧的浏览器中不起作用:))添加/编辑以下内容到你的tsconfig.json:

"compilerOptions": {
    "target": "ES6"
}
Run Code Online (Sandbox Code Playgroud)

编辑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 .以编译您的项目.你应该没有错误.

  • 非常感谢Dick van den Brink!在tsd查询后启动并运行es6-promise --action install --save (4认同)
  • 请注意,Typescript v1.7.x在C:\ Program Files(x86)\ Microsoft Visual Studio 12.0\Common7\IDE\CommonExtensions\Microsoft\TypeScript\lib.es6.d.ts中定义了es6 promise定义文件. (2认同)
  • 我想我和@Kokodoko 有同样的问题——我的 package.json 在第一条语句后得到更新,但它没有被 Intellisense 接收(我使用的是 VS),它可以转换和运行,但看起来像是 VS Intellisense 问题......对此有什么想法吗?我已经尝试恢复/安装软件包,但没有任何区别。 (2认同)
  • 你好.我认为应该使用标志`--save-dev`而不是`--save`,因为该库仅在编译时使用. (2认同)
  • 这已经过时了.您不必将目标设置为ES6,也不必安装打字文件.请参阅下面的答案. (2认同)

Sha*_*tin 48

备选方案#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"
    ]
}
Run Code Online (Sandbox Code Playgroud)

备选方案#2

使用NPM安装es6-shim组织类型.

npm install @types/es6-shim --save-dev
Run Code Online (Sandbox Code Playgroud)

备选方案#3

在TypeScript 2.0之前,使用typingses6-shimDefinitelyTyped全局安装.

npm install typings --global --save-dev
typings install dt~es6-shim --global --save-dev
Run Code Online (Sandbox Code Playgroud)

typings选项用于全局npm安装typings,然后用于typings安装垫片.该dt~前缀是指从DefinitelyTyped下载垫片.该--global选项意味着垫片的类型将在整个项目中可用.

也可以看看

https://github.com/Microsoft/TypeScript/issues/7788 - 找不到名字'Promise'并且找不到名字'require'

  • 除非你的目标支持ES2016,否则包括`es2016`不是一个好主意.有很多浏览器支持承诺,但不支持ES2016中的所有内容.使用`es2015.promise`只包含promises类型,而不需要为ES2016中的所有内容提取类型. (2认同)

pal*_*ind 23

从TypeScript 2.0开始,您可以通过在您的内容中包含以下内容来包含本机承诺的输入 tsconfig.json

"compilerOptions": {
    "lib": ["es5", "es2015.promise"]
}
Run Code Online (Sandbox Code Playgroud)

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

  • 我认为这是最好的答案.它不需要更改编译目标或引入所有es2015类型. (3认同)

Pla*_*Yao 13

如果您使用node.js 0.12或更高版本/ typescript 1.4或更高版本,只需添加编译器选项,如:

tsc a.ts --target es6 --module commonjs
Run Code Online (Sandbox Code Playgroud)

更多信息:https://github.com/Microsoft/TypeScript/wiki/Compiler-Options

如果你使用tsconfig.json,那么像这样:

{
    "compilerOptions": {
        "module": "commonjs",
        "target": "es6"
    }
}
Run Code Online (Sandbox Code Playgroud)

更多信息:https://github.com/Microsoft/TypeScript/wiki/tsconfig.json

  • @AdrianBer实际上你可以,事情发生了变化.https://github.com/Microsoft/TypeScript/wiki/What%27s-new-in-TypeScript#support-for---target-es6-with---module (3认同)

Nic*_*ens 12

这是最近这样做的方法,上面的答案已经过时了:

typings install --global es6-promise

  • 我们收到以下错误:尝试将"es6-promise"编译为全局模块,但它看起来像一个外部模块.您需要删除全局选项才能继续. (3认同)

Vaz*_*Vaz 6

A.如果使用"target": "es5"和TypeScript版本低于2.0:

typings install es6-promise --save --global --source dt
Run Code Online (Sandbox Code Playgroud)

B.如果使用"target": "es5"和TypeScript版本2.0或更高版本:

"compilerOptions": {
    "lib": ["es5", "es2015.promise"]
}
Run Code Online (Sandbox Code Playgroud)

C.如果使用"target": "es6",则无需做任何事情.

  • 我正在使用``target':"es6"`和TypeScript 2.1.1,我仍然得到`找不到名字'Promise'. (4认同)

Bib*_*rya 5

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

由于ES6 Promises是原生的,因此无需安装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); 
    }
);
Run Code Online (Sandbox Code Playgroud)