如何在原生 ES6 Promise 中使用 Typescript

IT技术 javascript typescript es6-promise
2021-02-02 07:40:13

我是一个完整的 Typescript 初学者,想知道是否可以在 Typescript 中使用 ES6 Promise,以及我必须做些什么才能让它们工作。我正在运行节点 0.11.14 并且在编译过程中出现错误“找不到名称 'Promise'”

6个回答

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

例如,您可以使用(如@elclanrs 所说)将 es6-promise 包与来自绝对类型的定义文件一起使用: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文件为你。

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

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

替代方案#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

在 TypeScript 2.0 之前,使用typings来安装es6-shim来自绝对类型全局

npm install typings --global --save-dev
typings install dt~es6-shim --global --save-dev

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

也可以看看

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

es2016除非您的目标支持 ES2016,否则包含不是一个好主意。有很多浏览器支持 promises,但在 ES2016 中并不是所有的。用于es2015.promise仅包含 Promise 的类型,而无需为 ES2016 中的所有内容引入类型。
2021-04-07 07:40:13

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

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

这将包括 TypeScript 附带的Promise声明,而无需将目标设置为 ES6。

当您仅支持新浏览器时,这是一个选项。如果您需要 IE10 或更旧的 android 设备支持,您仍然需要一个 polyfill。
2021-03-21 07:40:13
这是最好的答案,我想。它不需要更改您的编译目标或引入所有 es2015 类型。
2021-04-01 07:40: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

@AdrianBer 其实你可以,事情变了。github.com/Microsoft/TypeScript/wiki/...
2021-03-16 07:40:13
您实际上不能同时使用 commonjs 和 es6。
2021-03-27 07:40:13
如果您打算支持 IE,这将不起作用。运行时,您会在浏览器中收到“语法错误”。
2021-04-10 07:40:13

这是执行此操作的最新方法,上述答案已过时:

typings install --global es6-promise

这不再是最新的方式。TypeScript 附带了开箱即用的 Promise 类型。无需安装任何东西。看我的回答。
2021-03-18 07:40:13
我们收到以下错误:尝试将“es6-promise”编译为全局module,但它看起来像一个外部module。您需要删除全局选项才能继续。
2021-03-21 07:40:13
现在最新的方法是: npm install @type/es6-promise --save
2021-04-01 07:40:13
Typings 已经存在了很长一段时间,但 TypeScript 2.0 将允许直接从 npm 安装定义文件(所以你不需要像 Typings 这样的额外工具)。当 TypeScript 2.0 可用时,用信息更新了我的帖子。
2021-04-05 07:40:13