Есть ли более изящные способы типизировать диапазон number?

Да, в TypeScript есть несколько более изящих способов типизации диапазона чисел.

1. Использование типа "массив":
Один из способов типизировать диапазон чисел - использовать тип "массив". Например, чтобы создать тип, представляющий диапазон чисел от 1 до 10, можно объявить массив [1, 10]. Тип этого массива будет [number, number], где первый элемент - это начало диапазона, а второй элемент - конец диапазона. Затем можно использовать этот тип для аннотации входных параметров функций или переменных.

2. Использование пользовательского типа:
Еще один способ типизации диапазона чисел - создать пользовательский тип. Например, можно создать тип Range, который будет состоять из двух свойств: start и end, оба типа number. Такой тип позволит более гибко задавать различные диапазоны чисел.

type Range = {
   start: number;
   end: number;
};

const range: Range = {
   start: 1,
   end: 10
};

Теперь можно использовать тип Range для аннотации входных параметров функций или переменных.

3. Использование дженериков:
TypeScript поддерживает дженерики, что позволяет создавать обобщенные типы. Можно создать обобщенный тип Range<T>, где T - любой тип данных, к которому нужно ограничить диапазон чисел. Такой подход позволяет создавать и использовать более гибкие типы для разных типов чисел.

type Range<T> = {
   start: T;
   end: T;
};

const numberRange: Range<number> = {
   start: 1,
   end: 10
};

const dateRange: Range<Date> = {
   start: new Date(),
   end: new Date()
};

Это всего лишь несколько примеров более изящих способов типизировать диапазон чисел в TypeScript. В каждом конкретном случае выбор способа будет зависеть от требований проекта, конкретной ситуации и предпочтений разработчика.