system-praktyk-front/src/serialization/types.ts
2020-11-14 21:44:08 +01:00

27 lines
958 B
TypeScript

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