首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用ES6-承诺与TypeScript 2.1 ES5 Webpack (异步/等待)

使用ES6-承诺与TypeScript 2.1 ES5 Webpack (异步/等待)
EN

Stack Overflow用户
提问于 2016-11-25 08:11:08
回答 2查看 4.1K关注 0票数 2

我尝试使用es6-promise与TypeScript 2.1.1针对ES5和webpack。

app.ts

代码语言:javascript
复制
import "es6-promise/auto";

export class Foo {
    bar() : Promise<string>{
        return Promise.resolve("baz");
    }
}

webpack.common.js

代码语言:javascript
复制
const path = require('path');
var webpack = require('webpack');

module.exports = {
    entry: {
        'app': './app.ts',
    },

    output: {
        path: 'dist/ie',
        filename: '[name].js'
    },

    resolve: {
        extensions: ['', '.ts', '.js']
    },

    devtool: 'source-map',

    module: {
        loaders: [
            {
                test: /\.ts$/,
                loaders: ['awesome-typescript-loader']
            },
        ]
    },
    plugins: [  
        new webpack.ProvidePlugin({
            Promise: 'imports?this=>global!exports?global.Promise!es6-promises'
        }),

    ]
};

package.json

代码语言:javascript
复制
{
  "name": "foo",
  "ieArtifactName": "foo",
  "version": "3.0.0-1",
  "description": "...",
  "main": "src/app.ts",
  "author": {
    "name": "...",
    "email": "...",
    "url": "..."
  },
  "dependencies": {
    "@types/es6-promise": "0.0.32",
    "@types/jquery": "^2.0.34",
    "@types/underscore": "^1.7.34",
    "es6-promise": "^4.0.5",
    "es6-promise-promise": "^1.0.0",
    "es6-promises": "^1.0.10",
    "rxjs": "5.0.0-beta.12",
    "zone.js": "^0.6.23"
  },
  "devDependencies": {
    "awesome-typescript-loader": "=2.2.4",
    "clean-webpack-plugin": "^0.1.14",
    "css-loader": "^0.26.0",
    "exports-loader": "^0.6.3",
    "http": "0.0.0",
    "https": "^1.0.0",
    "imports-loader": "^0.6.5",
    "load-grunt-tasks": "^3.5.2",
    "node-static": "^0.7.9",
    "pug": "^2.0.0-beta6",
    "pug-html-loader": "^1.0.9",
    "raw-loader": "^0.5.1",
    "sass-loader": "^4.0.2",
    "style-loader": "^0.13.1",
    "typescript": "^2.1.1",
    "webpack": "^1.13.3",
    "webpack-dev-server": "^1.14.1",
    "webpack-merge": "^0.14.0"
  }
}

我使用命令行启动webpack

代码语言:javascript
复制
webpack --config config/webpack.common.js

行为如下:

  • Webstorm 2016.3.1强调一切都很好。
  • 编译器运行
  • 编译器显示默认D:...\app.ts:4:16中的两个错误,无法找到名称‘承诺’。

我尝试了es6-promisees6-promiseses6-promise-promise和一些导入表达式。

当我添加import {Promise} from "es6-promise"时,webstorm将其高亮显示为未使用的导入,但是错误已经消失。有没有可能在没有导入的情况下使用针对ES5的承诺?因为在将目标更改为ES6之后,我必须触摸每个文件并删除导入。

异步问题

我的目标是能够使用异步/等待,因为我习惯了来自C#的异步/等待,我讨厌回调地狱。如果我将代码更改为

代码语言:javascript
复制
export class Foo {
    async bar() : Promise<string>{
        return "baz";
    }
}

编译器再次发出抱怨。

找不到名字“承诺”。

添加导入import {Promise} from "es6-promise";使情况更加糟糕。

重复标识符“承诺”。编译器在包含异步函数的模块的顶层范围中保留名称“Promise”。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-11-25 09:22:44

通过将TypeScript添加到要包含在tsconfig.json中的库文件列表中,可以使"es2015.promise"编译器了解"es2015.promise"承诺。

代码语言:javascript
复制
{
    "compilerOptions": {
        "lib": [
            "dom",
            "es5",
            "scripthost",
            "es2015.promise"
        ]
    }
}

本机承诺仅在ES2015中引入,在您所针对的ES5中不可用。这就是为什么TypeScript编译器说它找不到名字Promise。由于您提供的是一个多填充,所以在运行时将有一个Promise。上述解决方案使TypeScript意识到了这一点。

编辑Sven-Michael

你甚至不需要通过提供插件提供Promise。你只需要import "es6-promise/auto";

票数 9
EN

Stack Overflow用户

发布于 2017-07-13 18:08:01

你也可以使用ES6-承诺填充。您可以以下列方式引用它(类型记录+ Webpack2):

代码语言:javascript
复制
entry: {
    'es6-promise',    
    'app': './app.ts',
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40800354

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档