gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 13:57:45 24 4
gpt4 key购买 nike

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

这是一个带有官方设置的 typescript 的 Nuxt.js 应用程序。过去,我曾尝试使用干净的 Nuxt.js 和 Vue 来设置它,但总是出现相同的错误。只有当我设置干净的 NodeJS(有或没有 typescript )或 @polkadot React 应用程序时 - 它运行良好。

我创建了一个 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);

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

最佳答案

简答:

代替这个 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 知道如何对您的数据进行解码和编码,所以在您的情况下,您声明的是 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 的 Substrate/Polkadot 特定版本

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

关于javascript - 添加自定义 @polkadot/types 时 Polkadot-js Babel 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56898273/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com