StorageObject, TypedField и типизированный JSON¶
Почти всё взаимодействие с сервером происходит через типизированный json
. Чтобы сервер мог правильно отрезолвить типы со стороны клиента для структур данных, используется TypedField
- вспомогательный объект, который добавляет информацию о типе значения.
Многие объекты в системе автоматически добавляют нужные типы при работе со значениями. Например:
const cardRequest = new CardRequest();
cardRequest.requestType = '7a2cb692-7a55-4519-b193-0ce2de435523';
При установке значения свойства requestType
добавлять явную информацию о типах не нужно. Объект сам проставит нужный тип при изменении. Но если свойство динамическое и мы не можем заранее узнать тип, то необходимо явно добавить информацию о типе. Например:
const cardRequest = new CardRequest();
cardRequest.info['MyDynamicValue'] = TypedField.createGuid('7a2cb692-7a55-4519-b193-0ce2de435523');
это актуально и для полей секций карточки:
const fields = card.sections.get('MySection').fields;
fields.set('MyValue', 10, FieldType.Int);
fields.set('MyAnotherValue', TypedField.createBoolean(false));
fields.set('MyNullValue', null);
Для значений null
тип указывать не нужно.
При чтении значений из объектов также стоит учитывать, что значения типизированные. Для заранее описанных свойств ничего делать не нужно и можно просто обращаться к свойству:
const requestType = cardRequest.requestType; // '7a2cb692-7a55-4519-b193-0ce2de435523'
Для динамических структур есть специальные вспомогательные объекты (StorageAccessor
и StorageHelper
):
// StorageAccessor
const sa = new StorageAccessor(cardRequest.info);
const myDynamicValue = sa.tryGetGuid('MyDynamicValue'); // '7a2cb692-7a55-4519-b193-0ce2de435523'
sa.setInt('MyNumber', 100);
// StorageHelper
const myNumber = StorageHelper.tryGetValue<FieldType.Int>(cardRequest.info, 'MyNumber');
Для полей секций карточки вспомогательные объекты не требуются:
const fields = card.sections.get('MySection').fields;
const myValue = fields.tryGetNumber('MyValue'); // 10
const myAnotherValue = fields.tryGetBoolean('MyAnotherValue'); // false
const myNullValue = fields.tryGet('MyNullValue'); // null