Функции проверки: isDate, isValid

date-fns предоставляет набор функций для работы с датами, среди которых особое место занимают проверки значений на корректность и тип. Функции isDate и isValid часто используются совместно, но решают принципиально разные задачи: первая определяет принадлежность к типу Date, вторая — фактическую корректность даты.

Функция isDate определяет, является ли переданное значение экземпляром объекта Date.

Сигнатура:

isDate(value: unknown): boolean

Основной смысл функции — проверка структуры объекта, а не его состояния.

Принцип работы

isDate возвращает true, если значение создано через конструктор Date:

import { isDate } from 'date-fns';

isDate(new Date()); // true
isDate(new Date(2020, 1, 1)); // true

isDate('2020-01-01'); // false
isDate(1580515200000); // false
isDate({}); // false

Важно учитывать ключевую особенность: даже некорректная дата остаётся объектом Date.

const invalid = new Date('invalid');

isDate(invalid); // true

Здесь функция подтверждает тип, но не валидность.

Типовая область применения

  • проверка входных данных API
  • защита функций, работающих строго с объектами Date
  • предотвращение ошибок при вызове методов даты

Проверка валидности: isValid

Функция isValid проверяет, является ли дата корректной (то есть представляет ли она реальное временное значение).

Сигнатура:

isValid(date: unknown): boolean

Принцип работы

Функция определяет, можно ли считать значение валидной датой, независимо от того, строка это, число или объект Date.

import { isValid } from 'date-fns';

isValid(new Date()); // true
isValid(new Date(2020, 1, 1)); // true

isValid(new Date('invalid')); // false

Также поддерживаются строки и timestamp:

isValid('2020-01-01'); // true
isValid(1580515200000); // true

isValid('not-a-date'); // false
isValid(NaN); // false

Особенность обработки входных данных

isValid пытается интерпретировать значение как дату. Если результатом становится Invalid Date, функция возвращает false.


Различие между isDate и isValid

Несмотря на схожее назначение, функции работают на разных уровнях проверки.

Функция Проверяет Результат true означает
isDate тип объекта значение является экземпляром Date
isValid корректность даты дата существует и валидна

Ключевой пример различия

const d = new Date('invalid');

isDate(d);  // true
isValid(d);  // false

Здесь видно, что объект существует, но временное значение некорректно.


Взаимодействие isDate и isValid

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

Защитная проверка

import { isDate, isValid } from 'date-fns';

function safeFormat(date) {
  if (!isDate(date)) {
    throw new Error('Ожидается объект Date');
  }

  if (!isValid(date)) {
    throw new Error('Некорректная дата');
  }

  return date.toISOString();
}

Такой подход разделяет две ответственности:

  • isDate гарантирует тип
  • isValid гарантирует смысловое корректное значение

Типичные ошибки при использовании

Ошибка 1: использование isDate вместо isValid

const value = new Date('invalid');

if (isDate(value)) {
  // ошибка: дата может быть невалидной
}

Такой код пропускает некорректные даты.


Ошибка 2: проверка строк через isDate

isDate('2020-01-01'); // false

Строка может быть валидной датой, но не является объектом Date.


Ошибка 3: доверие к new Date()

const d = new Date('not-a-date');

Конструктор не выбрасывает ошибку, а создаёт Invalid Date, что требует дополнительной проверки через isValid.


Практические сценарии применения

Валидация данных формы

import { isValid } from 'date-fns';

function validateBirthDate(input) {
  return isValid(input) && new Date(input) < new Date();
}

Работа с API

import { isDate, isValid } from 'date-fns';

function normalizeDate(value) {
  const date = value instanceof Date ? value : new Date(value);

  if (!isValid(date)) return null;

  return date;
}

Фильтрация массива дат

import { isValid } from 'date-fns';

const dates = [
  new Date('2020-01-01'),
  new Date('invalid'),
  '2021-05-05',
  1620000000000
];

const validDates = dates
  .map(d => new Date(d))
  .filter(isValid);

Поведение с крайними значениями

NaN и undefined

isValid(undefined); // false
isValid(NaN); // false

Пограничные строки

isValid(''); // false
isValid('2020-13-40'); // false

Timestamp

isValid(0); // true (1970-01-01)
isValid(-1); // true (дата до эпохи UNIX)

Важная модель понимания проверки дат

Логика двух функций формирует устойчивую модель обработки дат:

  • сначала определяется структура (isDate)
  • затем оценивается корректность (isValid)

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