添加自定义@ polkadot / types时出现Polkadot-js Babel错误

时间:2019-07-05 07:16:58

标签: javascript typescript vue.js babeljs substrate

我正在使用@ polkadot-js设置Nuxt.js应用。当我使用@ polkadot / types请求自定义基材运行时模块时-我收到此错误Class constructor Struct cannot be invoked without 'new'

这是针对Nuxt.js应用的,该应用具有正式的打字稿设置。过去,我尝试使用干净的Nuxt.js和Vue对其进行设置,但始终会出现相同的错误。仅当我设置干净的NodeJS(带有或不带有打字稿)或使用@polkadot react apps时,它才能很好地工作。

我创建了repository来尝试其他方法。

API调用:

class VecU32 extends Vector.with(u32) {}
class Kind extends Struct {
  constructor(value) {
    super({
        stuff: VecU32
    }, value);
  }
}

const Alice = "5GrwvaEF5zXb26Fz9rcQpDWS57CtERHpNehXCPcNoHGKutQY";

const provider = new WsProvider("ws://127.0.0.1:9944");
const typeRegistry = getTypeRegistry();
typeRegistry.register({ Kind });
const api = await ApiPromise.create(provider);
// With types providede in create function - works well
// types: {
//   Kind: {
//     stuff: "Vec<u32>"
//   }
// }
const res = await api.query.template.kinds(Alice);
console.log(res);

我期望结果输出为空(或某些值,具体取决于区块链中的内容),但实际输出为错误Class constructor Struct cannot be invoked without 'new'

1 个答案:

答案 0 :(得分:2)

简短答案:

执行以下操作,而不要使用此const typeRegistry = getTypeRegistry();

const typeRegistry.register({
          Kind: {
            'stuff': 'Vec<u32>'
          }
        });

更长的答案

在调用typeRegistry.register({ Kind });时,您试图将Typescript类注册为注册表中的自定义类型,但是需要传递给API的类型注册表的类型与您的无关打字稿类型,这两个不是直接关联的。

如果您要编写纯Javascript,则需要在Polkadot-JS API中注册自定义的Substrate Types。

传递给API的类型用于解码和编码要发送到/从衬底节点接收的数据。它们符合SCALE编解码器,后者也在Substrate核心Rust代码中实现。使用这些类型可确保可以在不同的环境和不同的语言中正确解码和编码数据。

您可以在此处了解更多信息:https://substrate.dev/docs/en/overview/low-level-data-format

这些类型的Javascript表示在Polkadot-JS文档中列为“编解码器类型”: https://polkadot.js.org/api/types/#codec-types

在Polkadot-JS文档中找到的所有其他类型都是这些低级编解码器类型的扩展。

您需要传递给JS-API的是所有自定义基材模块的所有自定义类型,以便API知道如何对数据进行解编码和编码,因此在您的情况下,您声明了here in Rust

pub struct Kind {
    stuff: Vec<u32>,
}

需要在Javascript中这样注册:

const typeRegistry.register({
          Kind: {
            'stuff': 'Vec<u32>'
          }
        });
另一方面,

您的 Typescript 类型可以确保您的处理客户端在前端使用Typescript编写的数据具有正确的类型。

Typescript只需要它们,并且它们增加了额外的安全性,但是与API通信不需要类型本身。不过,您的数据绝对必须具有正确的格式以防止出错。

您可以将https://www.npmjs.com/package/@polkadot/types视为https://github.com/DefinitelyTyped/DefinitelyTyped的底物/圆点特定版本

但是,即使您不使用打字稿https://polkadot.js.org/api/types/仍然是您的首选参考书。