@jsonjoy.com/json-type
Version:
High-performance JSON Pointer implementation
37 lines (36 loc) • 2.6 kB
TypeScript
import { Value } from './Value';
import { TypeSystem } from '../system/TypeSystem';
import type * as classes from '../type';
import type * as ts from '../typescript/types';
import type { TypeBuilder } from '../type/TypeBuilder';
import type { Printable } from 'tree-dump/lib/types';
import type { ResolveType } from '../system/types';
export type UnObjectType<T> = T extends classes.ObjectType<infer U> ? U : never;
export type UnObjectValue<T> = T extends ObjectValue<infer U> ? U : never;
export type UnObjectFieldTypeVal<T> = T extends classes.ObjectFieldType<any, infer U> ? U : never;
export type ObjectFieldToTuple<F> = F extends classes.ObjectFieldType<infer K, infer V> ? [K, V] : never;
export type ToObject<T> = T extends [string, unknown][] ? {
[K in T[number] as K[0]]: K[1];
} : never;
export type ObjectValueToTypeMap<F> = ToObject<{
[K in keyof F]: ObjectFieldToTuple<F[K]>;
}>;
export type TuplesToFields<T> = T extends PropDefinition<infer K, infer V>[] ? classes.ObjectFieldType<K, V>[] : never;
type PropDefinition<K extends string, V extends classes.Type> = [key: K, val: V, data: ResolveType<V>];
type PropDef = <K extends string, V extends classes.Type>(key: K, val: V, data: ResolveType<V>) => PropDefinition<K, V>;
export declare class ObjectValue<T extends classes.ObjectType<any>> extends Value<T> implements Printable {
static create: (system?: TypeSystem) => ObjectValue<classes.ObjectType<[]>>;
get system(): TypeSystem;
get t(): TypeBuilder;
keys(): string[];
get<K extends keyof ObjectValueToTypeMap<UnObjectType<T>>>(key: K): Value<ObjectValueToTypeMap<UnObjectType<T>>[K] extends classes.Type ? ObjectValueToTypeMap<UnObjectType<T>>[K] : classes.Type>;
field<F extends classes.ObjectFieldType<any, any>>(field: F | ((t: TypeBuilder) => F), data: ResolveType<UnObjectFieldTypeVal<F>>): ObjectValue<classes.ObjectType<[...UnObjectType<T>, F]>>;
prop<K extends string, V extends classes.Type>(key: K, type: V | ((t: TypeBuilder) => V), data: ResolveType<V>): ObjectValue<classes.ObjectType<[...UnObjectType<T>, classes.ObjectFieldType<K, V>]>>;
merge<O extends ObjectValue<any>>(obj: O): ObjectValue<classes.ObjectType<[...UnObjectType<T>, ...UnObjectType<O['type']>]>>;
extend<R extends PropDefinition<any, any>[]>(inp: (t: TypeBuilder, prop: PropDef, system: TypeSystem) => R): ObjectValue<classes.ObjectType<[...UnObjectType<T>, ...TuplesToFields<R>]>>;
toTypeScriptAst(): ts.TsTypeLiteral;
toTypeScriptModuleAst(): ts.TsModuleDeclaration;
toTypeScript(): string;
toString(tab?: string): string;
}
export {};