typealias в Kotlin — это механизм объявления альтернативного имени для существующего типа (класса, интерфейса, функции, generic-типа и т.д.). Используется для:
Ограничения:
Пример применения:
typealias ClickHandler = (View, MotionEvent) -> Unit fun setClickHandler(handler: ClickHandler) { // ... } val handler: ClickHandler = { view, event -> // Логика обработки }
Поддержка и читаемость:
Вопрос: "Являются ли typealias в Kotlin новыми типами с точки зрения компилятора и можно ли их использовать для ограничения значения переменных?"
Ответ: Нет, typealias только синоним типа. Они не образуют новый тип и не обеспечивают никакой дополнительной проверки на этапе компиляции. Все функции, переменные и параметры с typealias-типа — это всё тот же исходный тип.
Пример:
typealias UserId = String typealias Email = String fun process(id: UserId) {} fun process(email: Email) {} process("abc@def.com") // Нет ошибки — нельзя разграничить!
История
Использовали typealias для идентификаторов разных сущностей (UserId, OrderId), предполагали, что компилятор их различит, но в реальности передавали значения друг другу без compile-time ошибок, приводя к смешению логики и багам.
История
При миграции из старого API присвоили сложным лямбда-выражениям typealias-и, но в документации не указали новых определений. Итог — программисты не понимали, что означает алиас (например, Loader), и применяли его неверно, что вылилось в ошибки времени исполнения.
История
В одном из проектов переопределили typealias ViewClickHandler в разных файлах с разными подписями, полагая, что алиасы будут связаны глобально. В итоге — при автогенерации документации появилось дублирование, а при компиляции возник конфликт имён.