import { Moment } from "moment-timezone"; type Simplify = string | T extends string ? string : T extends number ? number : T extends boolean ? boolean : T extends Moment ? string : T extends Array ? Array> : T extends (infer K)[] ? Simplify[] : T extends Object ? Serializable : any; export type Serializable = { [K in keyof T]: Simplify } export type Transformer = { reverseTransform(subject: TResult, context?: TContext): TFrom; } & OneWayTransformer export type SerializationTransformer> = Transformer export type OneWayTransformer = { transform(subject: TFrom, context?: TContext): TResult; } export const identityTransformer: Transformer = { transform: subject => subject, reverseTransform: subject => subject }