В 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.