Комментарии 19
А чем не угодили class-transformer вместе с class-validator?
https://github.com/typestack/class-transformer
А чем не угодили class-transformer вместе с class-validator?
https://github.com/typestack/class-transformer
Кстати, что будет с типизированными массивами и вложенными классами?
Массивы валидируются. Массивы классов так же десериализуются. Вложенный класс если унаследован от Serializable так же десериализуется, если нет, то остается объектом. Огромные графы с массивами и классами так же десериализуются и валидируются.
Вот не согласен. Особенно учитывая, что множественного наследования нет. Если у меня User extends Person, а над Person контроля нет, как мне применить ваш Serializable?
А зачем это?
type AcceptedTypes = AcceptedType | Array<AcceptedTypes>;
для глубоко вложенных массивов типа [[[[1,2]]]]. Дело в том что typescript разрешает рекурсивные типы, но перестает валидировать их при использовании. А такая пирамида позволяет провалидировать до 10 уровня, а дальше уже через any.А если сделать так:
interface RecursiveArray<T> extends Array<T|RecursiveArray<T>> {}
type AcceptedType = ...;
type AcceptedTypes = RecursiveArray<AcceptedType>;
Живое демо, валидируется нормально.
Подсмотрено в тайпингах Lodash.
Тоже думал написать что-то похожее, но потом отказался от идеи, слишком много сил надо чтобы написать полноценное решение и будущее декораторов выглядело смутно. Самая неприятная проблема — работа с датами, но ее можно решить по-другому.
Сейчас есть интересная альтернатива — TypeScript Custom Transformers, что позволяет делать кодогенерацию во время компиляции, еще не все сделано, но уже можно пробовать. По идее можно будет обойтись без кучи декораторов. Еще один способ — кодогенерация по моделям бэкенда или свагеру.
Со временем работать просто. Если нужно исключить влияние таймзоны надо оставить его строкой, если нет, то десериализовать в локальное время.
TypeScript Custom Transformers — спасибо за наводку. Кажется эта штука избавит нас от browserify/webpack и позволит компилировать в ES2015.
Про кодогенерацию моделей и репозиториев с валидацией из свагера тоже есть идея, надеюсь скоро удастся реализовать.
За саму реализацию автору однозначно плюс в карму.
Но я советую как можно быстрее уходить от такого подхода. Вы двигаетесь в сторону ActiveRecord. В данном случае вы впиливаете функционал сохранения данных в Вашу модель. Этот функционал ни каким образом не относится к смыслу модели.
Вынесите этот функционал в сервис и получите более чистый и распределенный код.
TypeScript: Десериализация JSON в классы с валидацией типов у свойств