1. Функции/методы, объявление структуры
2. Встроенные типы
3. Настройка типов, дополнительный синтаксис и расширение объектов структур
4. Объявление новых локальных типов данных

Предоставляются следующие функции/методы:

Функции/методы, объявление структуры

Встроенные типы

Чтобы использовать любой из дополнительных типов с характеристиками по умолчанию, достаточно написать его название, как если бы это был примитив или свойство глобального объекта ("строка", 123, undefined, window и т.п.). Конечное значение будет случайным. Полный список новых встроенных типов:

Настройка типов, дополнительный синтаксис и расширение объектов структур

Для некоторых типов можно указывать границы значений или дополнительные характеристики, которые можно свободно комбинировать между собой в любой порядке:

Внутри описания структуры данных нельзя напрямую использовать конкатенацию, арифметические выражения, Object.assign(...) и любые другие взаимодействия новых типов (кроме uniq) с чем угодно (другими новыми типами или примитивами JS).

Для любого из новых типов или имеющихся в JS примитивов/объектов (кроме массивов, так как у них такой синтаксис используется для доступа к элементу массива) можно указать, что требуется массив фиксированной длины из значений такого вида, в том числе многомерный массив: coefs: float[4], statuses: int(0, 4)[2][4].

Для таких массивов можно задать случайную длину, используя один из новых типов данных: a: { b: 'c' }[int(4, 8)].

Внутри массивов, объявленных вышеприведённым способом, можно использовать тип uniq (см. описание во втором разделе), чтобы генерировать массивы объектов с уникальными значениями некоторых полей: myArray: { id: 'smth' + uniq, hello: 'world' }[12].

Можно получить случайное значение из фиксированного списка, используя специальную функцию: smth: oneOf(2, 'hello').

На самом объекте, объявленном через DataStructure.defineData(...), нельзя объявлять новые свойства или перезаписывать существующие.

Объявление новых локальных типов данных

Можно объявлять новые типы данных прямо внутри объекта; они будут работать только для объекта, внутри которого объявляются: $customType: { from: int(0, 9), to: int(0, 9) }, hello: customType, world: customType[4].

Если нужна поддержка опционального синтаксиса наподобие указания диапазона значений, то тип объявляется как функция: $x: function(a, b) { return int(a, b); }, test1: x(2, 4), test2: x.

Опциональные методы типов можно задать только для типов, возвращающих объекты или массивы (не примитивы типа string, number, boolean и т.п.); названия методов начинаются с "_", но при использовании этот символ уже не нужен. Опциональные методы принимают первым аргументом объект/массив, возвращаемый новым типом, и вторым аргументом – массив из передаваемых методу аргументов; метод должен возвращать новый или изменённый объект/массив нового типа. Пример:

$x: function(a, b) { return { name: 'fake object', value: int(a, b), _name: function(sourceObject, [newName]) { return { ...sourceObject, name: newName }; }, }; }, test1: x, test2: x(2, 4), test3: x.name('another fake object'), test4: x(3, 5).name('and one more'), test5: x.name('Порядок вызова не важен')(3, 5),

Если требуется использование нескольких новых типов данных в разных объектах (например, по всему проекту), то можно упростить повторное объявление следующим образом:

// Объявляем где-то простой объект с нужными нам типами const NEW_TYPES = DataStructure.defineData({ $customType1: { a: int(0, 3), b: float(0, 3) }[int(0, 30)], $customType2: function(...a) { return { all: a, one: oneOf(a) }; } }); // Переиспользуем объект const MY_DATA = DataStructure.defineData(NEW_TYPES, { smth: customType1[3], abc: customType2('red', 'blue', 'green'), });

1. Функции/методы, объявление структуры
2. Встроенные типы
3. Настройка типов, дополнительный синтаксис и расширение объектов структур
4. Объявление новых локальных типов данных