无法使用打字稿和以太坊访问 web3 对象

Cannot access web3 object with typescript and ethereum

我用 angular 2 和打字稿从头开始了一个新项目:

ng new myProject

然后我安装了 web3(用于以太坊)

npm install web3

在index.html的头部添加了:

<script src="node_modules/web3/dist/web3.min.js"></script>

这条路径似乎没问题,因为我没有错误(如果我更改一个字符,我就会出错)。 在文档中: https://www.npmjs.com/package/web3 我发现了这个:直接从全局命名空间使用 web3 对象: console.log(web3); 但是 web3 没有定义。 我怎样才能得到这个对象? 注意:在后台我开始了 geth --testnet

你还需要先实例化它。测试 JavaScript:

var web3 = new Web3();
window.console.log(web3);
> Object { _requestManager: Object, currentProvider: undefined, eth: 
    Object, db: Object, shh: Object, net: Object, personal: Object, bzz: 
    Object, settings: Object, version: Object, 2 more… }

虽然我没有使用 TypeScript 的经验,但你明白了。 web3js 正在提供库,您需要对其进行初始化才能使用。它基本上是链接文档页面的第一行。

我找到了一个解决方案,但有一半时间转译器会在转译代码时抛出错误。 我所做的是从 window 对象中显式获取 web3 对象。

private getWeb3Provider(): Web3 {
if (typeof window.web3 !== 'undefined') {
  return new Web3(window.web3.currentProvider);
} else {
  this.web3 = new Web3(new Web3.providers.HttpProvider('http://localhost:8545'));
  return this.web3;
}}

并且在构造函数中:

constructor() {
    this.name = 'Web3 Service';
    console.log(`${this.name}: initialized...`);
    this.web3 = this.getWeb3Provider();
  }

您可以像这样从 Window 对象中获取对象:

var web3: any = window["web3"];
var Web3: any = window["Web3"];
var web3 = new Web3(web3.currentProvider);
this.contract = web3.eth.contract(this.contractAbi).at(this.contractAddress);