#hcl-types-and-coercion
Какие типы есть в HCL? Что приведётся неявно, а что нет?
Что отвечать
Примитивы: string, number, bool. Коллекции: list(T), set(T), map(T), tuple([T1,T2,...]), object({k1=T1, k2=T2}). Плюс null. Coercion: число приведётся к string в интерполяции (`"port=${var.port}"`), bool к string как `"true"`. Обратно - нет: строку `"5"` в number руками через `tonumber()`. Между list и tuple - разница: list требует одинаковый T, tuple - фиксированной длины с разными T. Set теряет порядок и дубликаты.
Что хотят услышать
Кандидат должен: - не путать list и set: set удобен для `for_each`, но порядок не гарантирован. List - порядок есть, дубликаты есть - знать про `tostring`, `tonumber`, `tobool`, `tolist`, `toset`, `tomap` - явные converters - объяснить object vs map: map(string) требует одинаковый тип значений, object позволяет разные типы по ключам - сказать что type constraint в variable - не «строгий тип», а форма. `optional()` позволяет отсутствие поля в object'е (с 1.3+)
Подводные камни
- ✗ Объявить `variable foo { type = list }` без параметра - принимает что угодно, проверки нет. Всегда писать `list(string)`
- ✗ Сравнивать `[1,2,3]` с `tolist([1,2,3])` - одно tuple, второе list, типы разные, `==` сравнит как разные
- ✗ Использовать `for_each` с list - старые версии падали, новые потребуют `toset()`. Set'ом сразу
Follow-up
- ? Чем `object({})` отличается от `map(any)` в variable?
- ? Что вернёт `toset([1,1,2])`?
- ? Когда нужен `optional()` в object-type?
Глубина в базе знаний