【问题标题】:how to use es6-promises with typescript?如何在打字稿中使用 es6-promises?
【发布时间】:2015-12-01 05:12:48
【问题描述】:

我阅读了this SO question,但无法获得使用打字稿的承诺。希望我们能做出明确的指导。 这是针对服务器/节点项目的。我实际上使用的是最新的 iojs,但以 ES5 作为输出。

$ tsd query es6-promise --action install --save
$ npm install --save es6-promise


// typescript code:

/// <reference path="../../typings/es6-promise/es6-promise.d.ts"/>

var Promise = require("es6-promise").Promise;
require('es6-promise').polyfill();

function test():Promise {
    var p:Promise = new Promise();
    return p;
}

这给出了错误:

Cannot find name 'Promise'.

// 或者:

var p = new Promise<string>((resolve, reject) => {
    resolve('a string');
});


//error=> Untyped function calls may not accept type arguments.

从您自己的节点服务器端代码返回 Promise 的推荐方式是什么?

参考:

【问题讨论】:

    标签: typescript es6-promise


    【解决方案1】:

    将以下内容添加到package.json

    "dependencies": {
      "es6-promise": "~4.1.0"
    },
    "devDependencies": {
      "@types/es6-promise": "^0.0.32"
    }
    

    【讨论】:

    • 如果我这样做,我需要导入Promise还是我可以直接使用它?
    • @MuhammadRehanSaeed 如果你这样做,你必须import {Promise,} from 'es6-promise'; 才能使用它。这就是让这个“解决方案”变得丑陋的原因……
    【解决方案2】:

    您无需安装任何库即可使用 Promise、async/await 和其他新内容并以 es5 为目标。只要确保你包含一个支持 Promise 的 lib 版本,通常我使用 esnext - 你可以更加谨慎..

    {
      "compilerOptions": {
        "target": "es5",
        "module": "commonjs",
        "lib": ["esnext", "dom"], 
        "strict": true, 
        "esModuleInterop": true,
        "sourceMap": true,
        "outDir": "./dist", 
        "rootDir": ".",
      },
      "include": ["src"]
    }
    

    瞧,还可以使用 Promise 和异步等待:

    async function f(url:string){
        const response = await fetch(url)
        var data = await decodeOrThrow(await response.arrayBuffer())
    }
    

    【讨论】:

    • 这个问题早在 io.js 还很流行的时候......现在似乎都可以开箱即用了,就像你说的那样!
    【解决方案3】:

    我需要为不同的框架(特别是 axios)填充它;我不需要真正创建自己的 Promise,所以这些解决方案都不适合我。幸运的是,如果隐藏得当,答案很简单:

    import { polyfill } from 'es6-promise'
    
    polyfill();
    

    【讨论】:

    • 超级迟来的反应,但我只是想插话,你的个人是我的首选方法。 TS 2.7.2 没有其他框架(例如,没有 Angular),es6 承诺和polyfill() 是支持 IE11 的最简单方式。谢谢。
    【解决方案4】:

    在您的 tsconfig.json 中将目标更改为“es6”

    "compilerOptions": {"target": "es6" }
    

    或者安装TypeScript for Visual Studio 2015也可以解决这个问题,无需修改tsconfig.json

    https://www.microsoft.com/en-us/download/details.aspx?id=48593

    【讨论】:

      【解决方案5】:

      以下是在 v2.1.1+ 上,目标设置为 es5

      通过安装es6-promise,然后将其添加到文件顶部,我能够将 Promises 与 async/await 一起使用:

      global.Promise = require('es6-promise').Promise;
      

      这个给tsconfig.json

      "lib": [ "es2015.promise", "es5" ],
      

      使用 import { Promise } 表单对我不起作用,因为其他库正在崩溃(例如:axios)

      【讨论】:

        【解决方案6】:

        main.ts

        import {Promise} from 'es6-promise';
        const p: Promise<string> = new Promise (
           (resolve: (str: string)=>void, reject: (str: string)=>void) => {
              const a: string = "hello from Promise";
              resolve(a);
           }
         );
        p.then((st) => {
          console.log(st);
        });
        

        tsconfig.json

        {
            "compilerOptions": {
                "target": "es3",
                "module": "commonjs",
                "declaration": false,
                "noImplicitAny": false,
                "noLib": false
            },
            "filesGlob": [
                "./**/*.ts",
                "!./node_modules/**/*.ts"
            ],
            "files": [
                "./main.ts",
                "./typings/es6-promise/es6-promise.d.ts"
            ]
        }
        

        编译运行.sh

        #!/bin/sh
        npm install es6-promise
        tsd install es6-promise
        tsc
        node main.js
        

        【讨论】:

        • 现在推荐使用typings而不是tsd
        • 使用 Angular 2 的注意事项:你不需要(也不应该使用)import {Promise} 语句,你不需要 es6-promise.d.ts,因为这是捆绑的使用 Angular 2 框架(无论如何,从 beta 15 开始)。
        • “es6-promise”是你必须下载的东西吗?
        • 如果使用Typescript 2+,可以在tsconfig.json中指定promise类型:"compilerOptions": { "lib": [ "es2015.promise", (your other libs, ex "es5" and "dom") ] }
        • typings install --save --global dt~es6-promise 足以满足 tsc --version 版本 2.0.3
        猜你喜欢
        • 2021-10-26
        • 2020-08-30
        • 2016-12-12
        • 1970-01-01
        • 2015-07-13
        • 1970-01-01
        • 2016-09-17
        • 1970-01-01
        • 2016-06-07
        相关资源
        最近更新 更多