--- url: /templates/advanced/types.md description: >- Типы данных шаблонного движка, автоматическая конвертация, истинность значений, Undefined, строгий режим и то, как значения выводятся в сообщение. --- # Типы и конвертация

Движок сам приводит значения к нужному типу: текст «12» станет числом при сложении, пустое значение — нулем при сравнении. Обычно об этом можно не думать, но полезно знать правила, когда что-то работает неожиданно.

## Базовые типы { #types } | Тип | Что это | Пример | |---|---|---| | String | Строка текста | `'Анна'` | | Number | Целое или дробное число | `42`, `2.5` | | Boolean | Логическое значение | `true`, `false` | | null | Явно пустое значение | `null` | | Undefined | Значения нет: несуществующая переменная, свойство или индекс | `member.nope` | | List | Список, до 250 элементов | `[1, 2, 3]` | | Range | Диапазон целых чисел | `[1..10]` | | Map | Карта «ключ → значение», до 250 пар, порядок сохраняется | `{ a: 1 }` | | DateTime | Дата и время с часовым поясом | `now()` | Кроме того, есть типы данных Telegram и бота: [Member](/reference/member), [Chat](/reference/chat), [Topic](/reference/topic), [Message](/reference/message), [BotRole](/reference/bot-role) и другие — они описаны в справочнике типов. Узнать тип значения можно функцией `typeof`: `{{ typeof(member) }}` выведет `Member`. ## Истинность { #truthy } В `if`, `and`, `or`, `?:` и `require` любое значение превращается в «да» или «нет»: | Значение | Считается ложью, если | |---|---| | `null`, `Undefined` | всегда | | Строка | пустая `''` | | Число | равно `0` | | Список, карта | пустые | | Логическое | `false` | Все остальное — истина. Поэтому `{% if member.username %}` значит «если username есть». ## Конвертация { #convert } | Нужно | Из чего | Результат | |---|---|---| | Число | `null`, `Undefined` | `0` | | | `true` / `false` | `1` / `0` | | | строка | число, если строка похожа на число (`'12'`, `'-1.5'`), иначе «не число» | | | DateTime | Unix-время в миллисекундах | | Логическое | см. [истинность](#truthy) | | | Строка | что угодно | так же, как при [выводе](#output) | | DateTime | строка | дата в формате ISO 8601 (`'2026-09-01T18:00:00Z'`) или `'now'` | | | число | Unix-время в миллисекундах | Конвертация работает в операторах, в условиях, в аргументах функций и методов. ::: warning Кроме методов списков и карт Внутри методов списков и карт типы сравниваются строго: `[1..3].contains('1')` — это `false`, потому что `'1'` — строка, а в диапазоне числа. Приводите значение явно: `[1..3].contains(arguments.get(1) + 0)`. ::: ## Undefined и строгий режим { #strict } Обращение к несуществующей переменной, свойству или элементу дает `Undefined`. Он выводится пустой строкой и не ломает шаблон — это удобно, но скрывает опечатки: `{{ member.nmae }}` просто ничего не выведет. Строгий режим включается тегом в начале шаблона: ```template {% use 'strict' %} {{ member.nmae }} ``` В строгом режиме ошибкой становятся: * вывод `Undefined` — ошибка `undefined_variable`; * обращение к неизвестному свойству — `unknown_property`; * арифметика с нечисловыми значениями — `type_error`. Строгий режим полезен, пока вы пишете и отлаживаете сложную команду. ## Вывод значений { #output } Как значение выглядит в сообщении, когда его выводят через `{{ }}`: | Значение | Вывод | |---|---| | Целое число | `42` | | Дробное число | Кратчайшая точная запись без лишнего `.0`: `2.5`, `4.84` | | Логическое | `true` / `false` | | `null`, `Undefined` | Пустая строка | | Список | `[a, b]` | | Карта | `{k: v}` | | DateTime | Дата в формате `сб, 11 апр. 2026 15:27:38 MSK` на языке чата. По нажатию Telegram покажет ее в часовом поясе того, кто смотрит | | Member | Упоминание: имя-ссылка на профиль | | Chat | Название чата | | BotRole | Эмодзи и название роли | | Topic | Название топика | Чтобы вывести дату в своем формате, используйте функцию [`date`](./functions#date), а чтобы каждый видел время в своем поясе и на своем языке — [`datetime`](./functions#datetime). ## Списки и карты { #collections } Списки и карты, **созданные в шаблоне**, можно менять методами: `list.add(x)`, `map.put(k, v)` и другими. Списки из данных бота (например, `club.members`) и диапазоны изменять нельзя — будет ошибка `immutable_list`. ```template {% set winners = [] %} {% for m in club.members %} {% if m.trophies >= 50000 %}{% do winners.add(m.name) %}{% endif %} {% endfor %} Лучшие: {{ winners | join(', ') }} ``` Все методы — в справочнике [List, Map, Range](/reference/collections).