如何使用Nativecript与本机ES6 Promises

时间:2014-12-19 20:23:49

标签: javascript typescript es6-promise

我是打字稿的完全初学者,我想知道是否可以在打字稿中使用ES6承诺以及我必须做些什么才能让它们发挥作用。我正在运行节点0.11.14并且在编译过程中遇到错误"找不到姓名'承诺'"

9 个答案:

答案 0 :(得分:121)

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

您可以使用(例如@elclanrs说)将es6-promise包与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 - source

<强> 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>;中使用promise。 执行tsc -p .以编译您的项目。你应该没有错误。

答案 1 :(得分:47)

备选方案#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

Use NPM to install来自types organizationes6-shim

npm install @types/es6-shim --save-dev

备选方案#3

在TypeScript 2.0之前,使用typingsDefinitelyTyped全局安装es6-shim

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 - 找不到名字'承诺'&amp;找不到名称'require'

答案 2 :(得分:23)

从TypeScript 2.0开始,您可以在tsconfig.json

中包含以下内容,以包含原生承诺的输入内容
"compilerOptions": {
    "lib": ["es5", "es2015.promise"]
}

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

答案 3 :(得分: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

答案 4 :(得分:12)

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

typings install --global es6-promise

答案 5 :(得分:6)

一个。如果使用"target": "es5"和TypeScript版本低于2.0:

typings install es6-promise --save --global --source dt

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

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

℃。如果使用"target": "es6",则无需执行任何操作。

答案 6 :(得分:5)

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

不需要安装npm,因为ES6 Promises是原生的。

Node.js项目 - &gt;属性 - &gt; 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); 
    }
);

答案 7 :(得分:-1)

我不得不将@types/core-js降级到9.36,以使其与我的tsconfig中设置的"target": "es5"一起使用。

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

答案 8 :(得分:-1)

字体问题 在 tsconfig.json 中,添加以下属性:"strictPropertyInitialization": false