Действительно, typealiases не гарантирует такого рода безопасность типов. Вместо этого вам нужно будет создать классы-оболочки вокруг значения Int
- это хорошая идея, чтобы эти классы данных работали так, чтобы с ними работало сравнение на равенство:
data class Meter(val value: Int)
data class Pixel(val value: Int)
Создание экземпляров этих классов можно решить с помощью свойств расширения:
val Int.px
get() = Pixel(this)
val pixelWidth: Pixel = 50.px
Единственная проблема в том, что вы больше не можете напрямую выполнять арифметические операции над экземплярами Pixel
и Meter
, например, функции преобразования теперь будут выглядеть так:
fun Meter.toPixel() = this.value * 100
Или квадратные вычисления, подобные этому:
fun calcSquareMeters(width: Meter, height: Meter) = width.value * height.value
Если вам действительно нужно прямое использование оператора, вы все равно можете определить его, но это будет довольно утомительно:
class Meter(val value: Int) {
operator fun times(that: Meter) = this.value * that.value
}
fun calcSquareMeters(width: Meter, height: Meter) = width * height