From e976d3a3ada178dbdff6a32dfb86c9b9c626a154 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Beno=C3=AEt=20Rouleau?= Date: Fri, 13 Dec 2024 16:35:54 -0500 Subject: [PATCH] New translations assemblyscript-migration-guide.mdx (Russian) --- .../assemblyscript-migration-guide.mdx | 157 +----------------- 1 file changed, 2 insertions(+), 155 deletions(-) diff --git a/website/pages/ru/release-notes/assemblyscript-migration-guide.mdx b/website/pages/ru/release-notes/assemblyscript-migration-guide.mdx index efcb37d2c28d..1047cc70ad5b 100644 --- a/website/pages/ru/release-notes/assemblyscript-migration-guide.mdx +++ b/website/pages/ru/release-notes/assemblyscript-migration-guide.mdx @@ -27,12 +27,8 @@ title: Руководство по миграции AssemblyScript - Добавлена поддержка литеральных строк шаблона ([v0.18.17](https://github.com/AssemblyScript/assemblyscript/releases/tag/v0.18.17)) - Добавление `encodeURI(Component)` и `decodeURI(Component)` ([v0.18.27](https://github.com/AssemblyScript/assemblyscript/releases/tag/v0.18.27)) - Добавление `toString`, `toDateString` и `toTimeString` к `Date` ([v0.18.29](https://github.com/ AssemblyScript/assemblyscript/releases/tag/v0.18.29)) -- Добавление `toUTCString` для `Date` ( -v0.18.30) - - - Добавление встроенного типа `nonnull/NonNullable` ([v0.19.2](https://github.com/AssemblyScript/assemblyscript/releases/tag/v0.19.2)) - - +- Добавление `toUTCString` для `Date` ([v0.18.30](https://github.com/AssemblyScript/assemblyscript/releases/tag/v0.18.30)) +- Добавление встроенного типа `nonnull/NonNullable` ([v0.19.2](https://github.com/AssemblyScript/assemblyscript/releases/tag/v0.19.2)) ### Оптимизации @@ -41,21 +37,15 @@ v0.18.30) - Кэширование большего количества обращений к полям в std Map и Set ([v0.17.8](https://github.com/AssemblyScript/assemblyscript/releases/tag/v0.17.8)) - Оптимизация по двум степеням в `ipow32/64` ([v0.18.2](https://github.com/AssemblyScript/assemblyscript/releases/tag/v0.18.2)) - - ### Прочее - Тип литерала массива теперь можно определить по его содержимому ([v0.9.0](https://github.com/AssemblyScript/assemblyscript/releases/tag/v0.9.0)) - Стандартная библиотека обновлена до версии Unicode 13.0.0 ([v0.10.0](https://github.com/AssemblyScript/assemblyscript/releases/tag/v0.10.0)) - - ## Как выполнить обновление? 1. Измените мэппинги `apiVersion` в `subgraph.yaml` на `0.0.6`: - - ```yaml ... dataSources: @@ -66,11 +56,8 @@ dataSources: ... ``` - 2. Обновите используемый Вами `graph-cli` до `latest` версии, выполнив: - - ```bash # если он у Вас установлен глобально npm install --global @graphprotocol/graph-cli@latest @@ -79,31 +66,21 @@ npm install --global @graphprotocol/graph-cli@latest npm install --save-dev @graphprotocol/graph-cli@latest ``` - 3. Сделайте то же самое для `graph-ts`, но вместо глобальной установки сохраните его в своих основных зависимостях: - - ```bash npm install --save @graphprotocol/graph-ts@latest ``` - 4. Следуйте остальной части руководства, чтобы исправить языковые изменения. 5. Снова запустите `codegen` и `deploy`. - - ## Критические изменения - - ### Обнуляемость В более старой версии AssemblyScript можно было создать такой код: - - ```typescript function load(): Value | null { ... } @@ -111,11 +88,8 @@ let maybeValue = load(); maybeValue.aMethod(); ``` - Однако в новой версии, поскольку значение обнуляемо, требуется проверка, например, такая: - - ```typescript let maybeValue = load() @@ -124,39 +98,28 @@ if (maybeValue) { } ``` - Или принудительно вот такая: - - ```typescript let maybeValue = load()! // прерывается во время выполнения, если значение равно null maybeValue.aMethod() ``` - Если Вы не уверены, что выбрать, мы рекомендуем всегда использовать безопасную версию. Если значение не существует, Вы можете просто выполнить раннее выражение if с возвратом в обработчике субграфа. - - ### Затенение переменных Раньше можно было сделать [затенение переменных](https://en.wikipedia.org/wiki/Variable_shadowing) и код, подобный этому, работал: - - ```typescript let a = 10 let b = 20 let a = a + b ``` - Однако теперь это больше невозможно, и компилятор возвращает эту ошибку: - - ```typescript ERROR TS2451: Cannot redeclare block-scoped variable 'a' @@ -164,29 +127,18 @@ ERROR TS2451: Cannot redeclare block-scoped variable 'a' ~~~~~~~~~~~~~ in assembly/index.ts(4,3) ``` - - Вам нужно будет переименовать дублированные переменные, если Вы используете затенение переменных. - - ### Нулевые сравнения - Выполняя обновление своего субграфа, иногда Вы можете получить такие ошибки: - - ```typescript ERROR TS2322: Type '~lib/@graphprotocol/graph-ts/common/numbers/BigInt | null' is not assignable to type '~lib/@graphprotocol/graph-ts/common/numbers/BigInt'. if (decimals == null) { ~~~~ in src/mappings/file.ts(41,21) ``` - - Чтобы решить эту проблему, Вы можете просто изменить оператор `if` на что-то вроде этого: - - ```typescript if (!decimals) { @@ -195,23 +147,17 @@ ERROR TS2322: Type '~lib/@graphprotocol/graph-ts/common/numbers/BigInt | null' i if (decimals === null) { ``` - Подобное относится к случаям, когда вместо == используется !=. - - ### Кастинг Раньше для кастинга обычно использовалось ключевое слово `as`, например: - - ```typescript let byteArray = new ByteArray(10) let uint8Array = byteArray as Uint8Array // equivalent to: byteArray ``` - Однако это работает только в двух случаях: - Примитивный кастинг (между такими типами, как `u8`, `i32`, `bool`; например: `let b: isize = 10; b as usize`); @@ -219,8 +165,6 @@ let uint8Array = byteArray as Uint8Array // equivalent to: byteArray Примеры: - - ```typescript // примитивный кастинг let a: usize = 10 @@ -228,9 +172,6 @@ let b: isize = 5 let c: usize = a + (b as usize) ``` - - - ```typescript // укрупнение по наследованию классов class Bytes extends Uint8Array {} @@ -239,14 +180,11 @@ let bytes = new Bytes(2) // bytes // то же, что: bytes as Uint8Array ``` - Есть два сценария, в которых Вы можете захотеть выполнить преобразование, но использовать `as`/`var` **небезопасно**: - Понижение уровня наследования классов (superclass → subclass) - Между двумя типами, имеющими общий супер класс - - ```typescript // понижение уровня наследования классов class Bytes extends Uint8Array {} @@ -255,9 +193,6 @@ let uint8Array = new Uint8Array(2) // uint8Array // перерывы в работе :( ``` - - - ```typescript // между двумя типами, имеющими общий суперкласс class Bytes extends Uint8Array {} @@ -267,11 +202,8 @@ let bytes = new Bytes(2) // bytes // перерывы в работе :( ``` - В таких случаях можно использовать функцию `changetype`: - - ```typescript // понижение уровня наследования классов class Bytes extends Uint8Array {} @@ -280,9 +212,6 @@ let uint8Array = new Uint8Array(2) changetype(uint8Array) // работает :) ``` - - - ```typescript // между двумя типами, имеющими общий суперкласс class Bytes extends Uint8Array {} @@ -292,11 +221,8 @@ let bytes = new Bytes(2) changetype(bytes) // работает :) ``` - Если Вы просто хотите удалить значение NULL, Вы можете продолжать использовать оператор `as` (или `variable`), но помните, что значение не может быть нулевым, иначе оно сломается. - - ```typescript // удалить значение NULL let previousBalance = AccountBalance.load(balanceId) // AccountBalance | null @@ -308,7 +234,6 @@ if (previousBalance != null) { let newBalance = new AccountBalance(balanceId) ``` - В случае обнуления мы рекомендуем Вам обратить внимание на [функцию проверки обнуления](https://www.assemblyscript.org/basics.html#nullability-checks), это сделает ваш код чище 🙂 Также мы добавили еще несколько статических методов в некоторые типы, чтобы облегчить кастинг: @@ -318,14 +243,10 @@ let newBalance = new AccountBalance(balanceId) - BigInt.fromByteArray - ByteArray.fromBigInt - - ### Проверка нулевого значения с доступом к свойству Чтобы применить [функцию проверки на нулевое значение](https://www.assemblyscript.org/basics.html#nullability-checks), Вы можете использовать операторы `if` или тернарный оператор (`?` и `:`) следующим образом: - - ```typescript let something: string | null = 'data' @@ -342,11 +263,8 @@ if (something) { } ``` - Однако это работает только тогда, когда Вы выполняете `if` / тернарную операцию для переменной, а не для доступа к свойству, например: - - ```typescript class Container { data: string | null @@ -358,23 +276,16 @@ container.data = 'data' let somethingOrElse: string = container.data ? container.data : 'else' // не компилируется ``` - В результате чего выдается ошибка: - - ```typescript ERROR TS2322: Type '~lib/string/String | null' is not assignable to type '~lib/string/String'. let somethingOrElse: string = container.data ? container.data : "else"; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ``` - - Чтобы решить эту проблему, Вы можете создать переменную для доступа к этому свойству, чтобы компилятор мог выполнять проверку допустимости значений NULL: - - ```typescript class Container { data: string | null @@ -388,15 +299,10 @@ let data = container.data let somethingOrElse: string = data ? data : 'else' // компилируется просто отлично :) ``` - - - ### Перегрузка оператора при доступе к свойствам Если Вы попытаетесь суммировать (например) тип, допускающий значение Null (из доступа к свойству), с типом, не допускающим значение Null, компилятор AssemblyScript вместо того, чтобы выдать предупреждение об ошибке компиляции, предупреждающую, что одно из значений допускает значение Null, просто компилируется молча, давая возможность сломать код во время выполнения. - - ```typescript class BigInt extends Uint8Array { @operator('+') @@ -419,11 +325,8 @@ let wrapper = new Wrapper(y) wrapper.n = wrapper.n + x // не выдает ошибок времени компиляции, как это должно быть ``` - Мы открыли вопрос по этому поводу для компилятора AssemblyScript, но пока, если Вы выполняете подобные операции в своих мэппингах субграфов, Вам следует изменить их так, чтобы перед этим выполнялась проверка на нулевое значение. - - ```typescript let wrapper = new Wrapper(y) @@ -434,37 +337,26 @@ if (!wrapper.n) { wrapper.n = wrapper.n + x // теперь `n` гарантированно будет BigInt ``` - - - ### Инициализация значения Если у Вас есть такой код: - - ```typescript var value: Type // null value.x = 10 value.y = 'content' ``` - Он будет скомпилирован, но сломается во время выполнения. Это происходит из-за того, что значение не было инициализировано, поэтому убедитесь, что Ваш субграф инициализировал свои значения, например так: - - ```typescript var value = new Type() // initialized value.x = 10 value.y = 'content' ``` - Также, если у Вас есть свойства, допускающие значение NULL, в объекте GraphQL, например: - - ```graphql type Total @entity { id: Bytes! @@ -472,11 +364,8 @@ type Total @entity { } ``` - И у Вас есть код, аналогичный этому: - - ```typescript let total = Total.load('latest') @@ -487,11 +376,8 @@ if (total === null) { total.amount = total.amount + BigInt.fromI32(1) ``` - Вам необходимо убедиться, что значение `total.amount` инициализировано, потому что, если Вы попытаетесь получить доступ к сумме, как в последней строке, произойдет сбой. Таким образом, Вы либо инициализируете его первым: - - ```typescript let total = Total.load('latest') @@ -503,11 +389,8 @@ if (total === null) { total.tokens = total.tokens + BigInt.fromI32(1) ``` - Или Вы можете просто изменить свою схему GraphQL, чтобы не использовать тип, допускающий значение NULL для этого свойства. Тогда мы инициализируем его нулем на этапе `codegen` 😉 - - ```graphql type Total @entity { id: Bytes! @@ -515,9 +398,6 @@ type Total @entity { } ``` - - - ```typescript let total = Total.load('latest') @@ -528,15 +408,10 @@ if (total === null) { total.amount = total.amount + BigInt.fromI32(1) ``` - - - ### Инициализация свойств класса Если Вы экспортируете какие-либо классы со свойствами, которые являются другими классами (декларированными Вами или стандартной библиотекой), то это выглядит следующим образом: - - ```typescript class Thing {} @@ -545,11 +420,8 @@ export class Something { } ``` - Компилятор выдаст ошибку, потому что Вам нужно либо добавить инициализатор для свойств, являющихся классами, либо добавить оператор `!`: - - ```typescript export class Something { constructor(public value: Thing) {} @@ -572,63 +444,44 @@ export class Something { } ``` - - - ### Инициализация массива Класс `Array` по-прежнему принимает число для инициализации длины списка, однако Вам следует соблюдать осторожность, поскольку такие операции, как `.push`, фактически увеличивают размер, а не добавляют его в начало, например: - - ```typescript let arr = new Array(5) // ["", "", "", "", ""] arr.push('something') // ["", "", "", "", "", "something"] // size 6 :( ``` - В зависимости от используемых типов, например, допускающих значение NULL, и способа доступа к ним, можно столкнуться с ошибкой времени выполнения, подобной этой: - - ``` ERRO Handler skipped due to execution failure, error: Mapping aborted at ~lib/array.ts, line 110, column 40, with message: Element type must be nullable if array is holey wasm backtrace: 0: 0x19c4 - !~lib/@graphprotocol/graph-ts/index/format 1: 0x1e75 - !~lib/@graphprotocol/graph-ts/common/collections/Entity#constructor 2: 0x30b9 - !node_modules/@graphprotocol/graph-ts/global/global/id_of_type ``` - Для того чтобы фактически начать, Вы должны либо инициализировать `Array` нулевым размером, следующим образом: - - ```typescript let arr = new Array(0) // [] arr.push('something') // ["something"] ``` - Или Вы должны изменить его через индекс: - - ```typescript let arr = new Array(5) // ["", "", "", "", ""] arr[0] = 'something' // ["something", "", "", "", ""] ``` - - - ### Схема GraphQL Это не прямое изменение AssemblyScript, но Вам, возможно, придется обновить файл `schema.graphql`. Теперь Вы больше не можете определять поля в своих типах, которые являются списками, не допускающими значение NULL. Если у Вас такая схема: - - ```graphql type Something @entity { id: Bytes! @@ -640,11 +493,8 @@ type MyEntity @entity { } ``` - Вам нужно добавить `!` к элементу типа List, например, так: - - ```graphql type Something @entity { id: Bytes! @@ -656,11 +506,8 @@ type MyEntity @entity { } ``` - Изменение произошло из-за различий в допустимости значений NULL между версиями AssemblyScript и связано с файлом `src/generated/schema.ts` (путь по умолчанию, возможно, Вы его изменили). - - ### Прочее - `Map#set` и `Set#add` согласованы со спецификацией, произведён возврат к `this` ([v0.9.2](https://github.com/AssemblyScript/assemblyscript/releases/tag/v0.9.2))