Типы и конвертация
Движок сам приводит значения к нужному типу: текст «12» станет числом при сложении, пустое значение — нулем при сравнении. Обычно об этом можно не думать, но полезно знать правила, когда что-то работает неожиданно.
Базовые типы
| Тип | Что это | Пример |
|---|---|---|
| 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, Chat, Topic, Message, BotRole и другие — они описаны в справочнике типов.
Узнать тип значения можно функцией typeof: {{ typeof(member) }} выведет Member.
Истинность
В if, and, or, ?: и require любое значение превращается в «да» или «нет»:
| Значение | Считается ложью, если |
|---|---|
null, Undefined | всегда |
| Строка | пустая '' |
| Число | равно 0 |
| Список, карта | пустые |
| Логическое | false |
Все остальное — истина. Поэтому {% if member.username %} значит «если username есть».
Конвертация
| Нужно | Из чего | Результат |
|---|---|---|
| Число | null, Undefined | 0 |
true / false | 1 / 0 | |
| строка | число, если строка похожа на число ('12', '-1.5'), иначе «не число» | |
| DateTime | Unix-время в миллисекундах | |
| Логическое | см. истинность | |
| Строка | что угодно | так же, как при выводе |
| DateTime | строка | дата в формате ISO 8601 ('2026-09-01T18:00:00Z') или 'now' |
| число | Unix-время в миллисекундах |
Конвертация работает в операторах, в условиях, в аргументах функций и методов.
Кроме методов списков и карт
Внутри методов списков и карт типы сравниваются строго: [1..3].contains('1') — это false, потому что '1' — строка, а в диапазоне числа. Приводите значение явно: [1..3].contains(arguments.get(1) + 0).
Undefined и строгий режим
Обращение к несуществующей переменной, свойству или элементу дает Undefined. Он выводится пустой строкой и не ломает шаблон — это удобно, но скрывает опечатки: {{ member.nmae }} просто ничего не выведет.
Строгий режим включается тегом в начале шаблона:
{% use 'strict' %}
{{ member.nmae }}В строгом режиме ошибкой становятся:
- вывод
Undefined— ошибкаundefined_variable; - обращение к неизвестному свойству —
unknown_property; - арифметика с нечисловыми значениями —
type_error.
Строгий режим полезен, пока вы пишете и отлаживаете сложную команду.
Вывод значений
Как значение выглядит в сообщении, когда его выводят через {{ }}:
| Значение | Вывод |
|---|---|
| Целое число | 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, а чтобы каждый видел время в своем поясе и на своем языке — datetime.
Списки и карты
Списки и карты, созданные в шаблоне, можно менять методами: list.add(x), map.put(k, v) и другими. Списки из данных бота (например, club.members) и диапазоны изменять нельзя — будет ошибка immutable_list.
{% set winners = [] %}
{% for m in club.members %}
{% if m.trophies >= 50000 %}{% do winners.add(m.name) %}{% endif %}
{% endfor %}
Лучшие: {{ winners | join(', ') }}Все методы — в справочнике List, Map, Range.