错误TS2705:ES5 / ES3中的异步函数或方法需要'Promise'构造函数

时间:2018-10-19 08:09:47

标签: typescript ethereum

我安装

npm install -g typescript

然后我想编译我的main.ts类,但是我总是遇到此错误

main.ts:14:2 - error TS2705: An async function or method in ES5/ES3 requires the 'Promise' constructor.  Make sure you have a declaration for the 'Promise' constructor or include 'ES2015' in your `--lib` option.

我的代码:

import { OrderWatcher, OnOrderStateChangeCallback, OrderWatcherConfig } from '@0xproject/order-watcher';
import { SignerSubprovider, RPCSubprovider, Web3ProviderEngine } from '@0xproject/subproviders';
import { Web3Wrapper } from '@0xproject/web3-wrapper';

let url = 'https://mainnet.infura.io/xxx';
//let url = 'http://localhost:8545';
let provider = new RPCSubprovider(url);
const providerEngine = new Web3ProviderEngine();
providerEngine.addProvider(provider);
providerEngine.start();

let orderWatcher = null;

(async () => {
    // Get all of the accounts through the Web3Wrapper
    const web3Wrapper = new Web3Wrapper(providerEngine);
    const blockNumber = await web3Wrapper.getBlockNumberAsync();
    const networkId = await web3Wrapper.getNetworkIdAsync();

    console.log(blockNumber);
    console.log(networkId);

    //let networkId = 1;
    //let partialConfig = new Partial<OrderWatcherConfig>();

    orderWatcher = new OrderWatcher(
     web3Wrapper.getProvider(), 
     networkId
     );

    //  orderWatcher.subscribe(
    //     ( error: Error|null, orderState?: OrderState ) : void => {
    //         console.log('callback');
    //         console.log(error);
    //         console.log(orderState);

    //     }
    //  );

    orderWatcher.subscribe(
        ( callback: OnOrderStateChangeCallback ) : void => {
            console.log('callback');
            //console.log(callback);
        }
     );

     console.log('end');
})();

console.log('end 2');

我有2个问题?

  1. 为什么我不能使用异步?为什么编译main.ts会引发错误
  2. 回调始终返回错误
  

无法将未定义或null转换为对象

编辑

我的tsconfig.json

{
  "compilerOptions": {
    "lib": [ "dom","es2015" ]
  },
  "files": [
    "main.ts"
  ],
  "exclude": [
    "node_modules",
    "**/*.spec.ts"
  ]
}

1 个答案:

答案 0 :(得分:1)

问题1:如何解决此问题取决于JavaScript代码将在其中运行的环境。您可以使用target中的tsconfig.json编译器选项(或在命令行中使用--target)来指定运行时环境支持的最新JavaScript功能级别,然后TypeScript会尽力而为将任何使用target级别不支持的功能的代码转换为将与target级别一起使用的等效代码。

异步功能是ES2017功能,因此,如果目标环境支持您计划使用的所有ES2017功能(请参阅this chart),则只需将target设置为es2017,然后TypeScript将传递异步功能。否则,TypeScript需要将异步函数转换为使用promise的函数,因此如果它认为您的目标环境可能不支持promise,则会发出警告。如果您的targetes6(与es2015相同)或更高版本,则可以保证对诺言的支持。如果您的目标不支持全部es6但支持承诺,则可以将es2015.promise添加到lib选项中以告知TypeScript支持承诺。否则,您必须提供自己的Promise库。

问题2:要解决此问题,对于初学者,我需要查看错误的堆栈跟踪。