Проверка на этапе компиляции

Одним из ключевых преимуществ Luxon является наличие полноценных TypeScript-типов, позволяющих переносить часть проверки корректности работы с датами и интервалами на этап компиляции. В экосистеме JavaScript это особенно важно, поскольку операции с датой и временем традиционно относятся к источникам скрытых ошибок: неверные форматы, перепутанные таймзоны, некорректные арифметические операции и смешивание различных представлений времени.

Типизация в Luxon формирует строгий контракт между разработчиком и библиотекой. Основные сущности — DateTime, Duration, Interval — описаны через интерфейсы и классы с явно заданными полями и методами. Это позволяет TypeScript выявлять ошибки до запуска кода, а не во время исполнения.


Типы как основа безопасной работы с датой и временем

Внутренние типы Luxon структурированы так, чтобы минимизировать возможность некорректного использования API.

DateTime

DateTime представляет момент времени с учётом временной зоны и календарной системы. Типизация исключает некорректные операции, например, прямое сложение строки с датой или попытку использовать несуществующее поле.

import { DateTime } from "luxon";

const dt: DateTime = DateTime.now();

const invalid = dt.plus({ days: "5" }); // ошибка компиляции
const valid = dt.plus({ days: 5 });

В этом примере типизация фиксирует строгий контракт: значения временных интервалов должны быть числовыми. Любая попытка передать строку или иной несовместимый тип приводит к ошибке на этапе компиляции.


Duration

Duration описывает промежуток времени и также строго типизирован.

import { Duration } from "luxon";

const d: Duration = Duration.fromObject({
  hours: 2,
  minutes: 30
});

const broken = Duration.fromObject({
  hours: "2h"
}); // ошибка компиляции

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


Interval

Interval объединяет два DateTime и требует строгого соответствия типов начальной и конечной границ.

import { DateTime, Interval } from "luxon";

const start: DateTime = DateTime.now();
const end: DateTime = start.plus({ days: 1 });

const interval: Interval = Interval.fromDateTimes(start, end);

Попытка передать несовместимые типы или перепутанные значения приводит к ошибке ещё до выполнения кода, что критично для систем планирования и расписаний.


Проверка корректности структур объектов

Типизация Luxon распространяется не только на классы, но и на объектные конфигурации. Методы, принимающие параметры, используют строго определённые структуры.

Строгие ключи объектов

Методы plus, minus, set, reconfigure используют фиксированные наборы ключей:

dt.plus({
  days: 1,
  weeks: 1
});

Попытка использования произвольных ключей приводит к ошибке компиляции:

dt.plus({
  dayz: 1 // ошибка: неизвестное свойство
});

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


Контроль таймзон и локалей на уровне типов

Типизация также ограничивает допустимые значения для параметров локализации и временных зон.

const dt = DateTime.now().setZone("Europe/Moscow");

Строка таймзоны не проверяется полностью на этапе компиляции (так как зависит от среды выполнения), однако типы ограничивают формат входных данных, не позволяя передавать произвольные структуры вроде чисел или объектов.

dt.setZone(123); // ошибка компиляции

Аналогично локали:

dt.setLocale("ru"); // корректно
dt.setLocale(10);   // ошибка компиляции

Выведение типов и цепочки методов

Luxon активно использует fluent API, где каждый метод возвращает новый экземпляр с сохранением типа. TypeScript отслеживает эти цепочки, предотвращая потерю контекста.

const result = DateTime.now()
  .setZone("UTC")
  .plus({ days: 3 })
  .toISO();

Результат строго типизирован как string, а не как any, что исключает неопределённость на границах системы.

Ошибки, возникающие при нарушении цепочки типов, выявляются сразу:

const broken = DateTime.now()
  .plus({ days: 1 })
  .invalidMethod(); // ошибка компиляции

Защита от некорректной арифметики времени

Одной из распространённых проблем в работе с датами является смешивание различных единиц измерения времени. Типизация Luxon частично устраняет эту проблему за счёт ограничений на входные параметры.

dt.plus({ hours: 1, minutes: 30 });

Попытка использовать несуществующие единицы приводит к ошибке:

dt.plus({ centuries: 1 }); // ошибка компиляции

Это ограничение снижает вероятность логических ошибок, которые в runtime могли бы проявиться как некорректные вычисления времени.


Интеграция с пользовательскими типами

Luxon хорошо сочетается с пользовательскими интерфейсами TypeScript, позволяя описывать доменные модели времени.

interface Event {
  title: string;
  start: DateTime;
  end: DateTime;
}

Такое описание позволяет компилятору проверять согласованность структуры событий без необходимости дополнительных проверок в runtime.

Ошибки становятся невозможными на уровне несоответствия типов:

const event: Event = {
  title: "Meeting",
  start: DateTime.now(),
  end: "tomorrow" // ошибка компиляции
};

Обобщённая безопасность API

Типовая система Luxon формирует слой защиты, который охватывает несколько категорий ошибок:

  • несоответствие типов аргументов;
  • использование несуществующих ключей в объектах;
  • некорректные цепочки методов;
  • подмена структурированных объектов примитивами;
  • нарушение контракта временных интервалов.

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