Polkadot-js Ошибка Babel при добавлении пользовательских @ polkadot / types - PullRequest
1 голос
/ 05 июля 2019

Я устанавливаю приложение Nuxt.js с помощью @ polkadot-js. Когда я делаю запрос к пользовательскому модулю времени выполнения подложки с моими @ polkadot / types - я получаю эту ошибку Class constructor Struct cannot be invoked without 'new'.

Это для приложения Nuxt.js с официальной настройкой машинописи. В прошлом я пытался настроить его с чистыми Nuxt.js и Vue, но всегда с одной и той же ошибкой. Только если я настрою чистый NodeJS (с или без машинописи) или с приложениями реагирования @polkadot - это будет хорошо.

Я создал репозиторий , чтобы попробовать другие способы.

вызов 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 Ответ

2 голосов
/ 05 июля 2019

Краткий ответ:

Вместо этого const typeRegistry = getTypeRegistry(); выполните:

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

Более длинный ответ

Когда вы звоните typeRegistry.register({ Kind });, вы пытаетесь зарегистрировать класс Typescript в качестве пользовательского типа в реестре, но типы, которые необходимо передать в реестр типов API, не имеют ничего общего с типами Typescript. эти два непосредственно не связаны друг с другом.

Событие, если вы будете писать простой Javascript, вам необходимо зарегистрировать свои собственные типы подложек в API Polkadot-JS.

Типы, передаваемые в API, используются для декодирования и кодирования данных, которые вы отправляете и получаете в / из вашего субстратного узла. Они совместимы с кодеком SCALE, который также реализован в коде Rust ядра Substrate. Использование этих типов гарантирует, что данные могут быть правильно декодированы и закодированы в разных средах и на разных языках.

Подробнее об этом можно прочитать здесь: 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, и они добавляют дополнительный уровень безопасности, но сами типы не нужны для взаимодействия с API. Ваши данные, безусловно, должны иметь правильный формат, чтобы избежать ошибок.

Вы можете думать о https://www.npmjs.com/package/@polkadot/types как о специфической для Субстрата / Полкадо версии https://github.com/DefinitelyTyped/DefinitelyTyped

Но даже если вы не используете Typescript, https://polkadot.js.org/api/types/ по-прежнему на 100% используется для перехода.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...