如何使用打字稿的es6-promises?

时间:2015-09-05 00:26:38

标签: typescript es6-promise

我读了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的推荐方法是什么?

的引用:

6 个答案:

答案 0 :(得分:51)

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"
    ]
}

compileandrun.sh

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

答案 1 :(得分:14)

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

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

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

这是tsconfig.json

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

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

答案 2 :(得分:7)

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

import { polyfill } from 'es6-promise'

polyfill();

答案 3 :(得分:1)

将以下内容添加到package.json

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

答案 4 :(得分:0)

您无需安装任何库即可使用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"]
}

瞧,也可以使用promises和async等待:

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

答案 5 :(得分:-2)

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

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

或者为Visual Studio 2015安装TypeScript也可以在不修改tsconfig.json

的情况下解决此问题

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