1

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

这适用于带有 typescript 官方设置的 Nuxt.js 应用程序。过去,我尝试使用干净的 Nuxt.js 和 Vue 设置它,但总是出现相同的错误。仅当我设置干净的 NodeJS(带或不带 typescript)或使用@polkadot react 应用程序时,它才能正常工作。

我创建了一个存储库来尝试其他一些方法。

接口调用:

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'.

4

1 回答 1

2

简短的回答:

而不是这个const typeRegistry = getTypeRegistry();,做:

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

更长的答案

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

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

传递给 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 知道如何对您的数据进行解码和编码,因此在您的情况下,您在 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 的 Substrate/Polkadot 特定版本

但即使你不使用 Typescript,https ://polkadot.js.org/api/types/仍然是 100% 的首选参考。

于 2019-07-05T12:34:28.363 回答