В JS/TS есть удобные методы для работы с JSON - stringify для конвертации в строку и parse для обратного преобразования строки в объект. В TypeScript есть типы и есть тип данных Date, но без некоторых особенностей реализации не обошлось. Хоть и быстро, но не сразу, проблема была определена и решена, но какое-то время было потрачено. Есть некоторые особенности, как сделать дату из строки и наоборот в JavaScript / TypeScript.
Обнаружил проблему при работе с импортом данных из JSON с дальнейшим преобразованием и ошибке, что метод toISOString() для переменной типа дата падал с ошибкой.
Ниже небольшие заметки, как работает дата при JSON преобразованиях.
// Создаем переменную типа Date
const dateObject = new Date()
// Выведем в консоль ее значение и тип
console.log(dateObject, typeof dateObject) // 2023-11-06T15:16:21.578Z object
// Преобразуем переменную типа Date в строку формата JSON
const stringDate = JSON.stringify(dateObject)
// Выведем в консоль ее значение и тип
console.log(stringDate, typeof stringDate) // "2023-11-06T15:16:21.578Z" string
// Преобразуем JSON строку в объект
const parseDate = JSON.parse(stringDate)
console.log('parseDate', parseDate, typeof parseDate) // "2023-11-06T15:16:21.578Z" string
// Преобразуем считанную из JSON обратно в дату. Использую библиотеку moment для этого
const dateStringDate = moment.utc(stringDate, 'yyyy-mm-DD HH:mm:ss').toDate()
console.log(dateStringDate, typeof dateStringDate) // 2023-01-06T15:16:21.000Z object
В целом, объяснить поведение можно, но для тех, кто забыл Javascript после TypeScript - немного удивительно 🙂
JSON.parse - это не десериализация, а преобразование в объект. в Javascript дата - это объект, а не специальный тип. Ведь TS в конечном счете - это JS.

