@jsonjoy.com/json-type
Version:
High-performance JSON Pointer implementation
23 lines (22 loc) • 1.71 kB
TypeScript
import type * as schema from '../schema';
import type * as classes from './classes';
import type { AliasType } from './classes/AliasType';
export type * from './classes';
export interface BaseType<S extends schema.SchemaBase> {
getSchema(): S;
}
export type Type = classes.AbsType<any> | classes.AnyType | classes.ConType<any> | classes.BoolType | classes.NumType | classes.StrType | classes.BinType<any> | classes.ArrType<any, any, any> | classes.ObjType<any> | classes.MapType<any> | classes.RefType<any> | classes.OrType<any> | classes.FnType<any, any, any> | classes.FnRxType<any, any, any>;
export type SchemaOf<T extends Type | Type[]> = T extends BaseType<infer U> ? U : never;
export type SchemaOfMap<M extends Record<string, Type>> = {
[K in keyof M]: SchemaOf<M[K]>;
};
export type SchemaOfObjectFieldType<F> = F extends classes.KeyOptType<infer K, infer V> ? schema.OptKeySchema<K, SchemaOf<V>> : F extends classes.KeyType<infer K, infer V> ? schema.KeySchema<K, SchemaOf<V>> : never;
export type SchemaOfObjectFields<F> = {
[K in keyof F]: SchemaOfObjectFieldType<F[K]>;
};
export type FilterFunctions<T> = {
[K in keyof T as T[K] extends classes.FnType<any, any, any> ? K : T[K] extends classes.FnRxType<any, any, any> ? K : never]: T[K] extends classes.FnType<any, any, any> ? T[K] : T[K] extends classes.FnRxType<any, any, any> ? T[K] : never;
};
export type TypeOfAlias<T> = T extends AliasType<any, infer T> ? T : T extends Type ? T : never;
export type ResolveType<T> = T extends AliasType<any, infer T> ? schema.TypeOf<SchemaOf<T>> : T extends Type ? schema.TypeOf<SchemaOf<T>> : T extends schema.Schema ? schema.TypeOf<T> : never;
export type infer<T> = ResolveType<T>;