import { ArrayModel } from "../src/array-model" import { FunctionModel, FunctionSignature } from "../src/function-model" import { MapModel } from "../src/map-model" import { SetModel } from "../src/set-model" import { BasicModel, ObjectModel } from "../src/object-model" import { Class, Prev } from "./helpers" export type ModelDefinition = any export type ObjectModelDefinition = Record export type FromDefinition = [Depth] extends [never] ? never /* Depth limit reached */ : T extends BasicModel ? FromDefinition : T extends ArrayModel ? FromDefinition[] : T extends ObjectModel ? FromObjectModelDefinition : T extends FunctionModel ? FunctionSignature : T extends MapModel ? Map, FromDefinition> : T extends SetModel ? Set> : T extends StringConstructor | RegExp ? string : T extends NumberConstructor ? number : T extends BooleanConstructor ? boolean : T extends new () => infer ConstructorType ? ConstructorType : T extends Class ? InstanceType : T extends ObjectModelDefinition ? FromObjectModelDefinition : T extends readonly [...infer U] ? FromUnionDefinition : T extends any[] ? FromDefinition // TypeScript can't infer array literals as tuples for now without assertions, see https://github.com/microsoft/TypeScript/issues/16656 : T export type FromObjectModelDefinition = { [K in keyof D]: FromDefinition } export type FromUnionDefinition = T extends [infer X] ? Optional : FromDefinition export type Optional = FromDefinition | undefined | null export type ExtendObjectDefinition)[]> = E extends [infer F, ...infer Rest extends (ObjectModelDefinition | ObjectModel)[]] ? F extends ObjectModel ? ExtendObjectDefinition : F extends ObjectModelDefinition ? ExtendObjectDefinition, Rest> : never : D