@jsonjoy.com/json-type
Version:
High-performance JSON Pointer implementation
31 lines (30 loc) • 2.17 kB
TypeScript
import { ModuleType } from '../type/classes/ModuleType';
import { Value } from './Value';
import { FnValue } from './FnValue';
import type { Printable } from 'tree-dump/lib/types';
import type * as classes from '../type';
import type { TypeBuilder } from '../type/TypeBuilder';
export type UnObjType<T> = T extends classes.ObjType<infer U> ? U : never;
export type UnObjValue<T> = T extends ObjValue<infer U> ? U : never;
export type UnObjFieldTypeVal<T> = T extends classes.KeyType<any, infer U> ? U : never;
export type ObjFieldToTuple<F> = F extends classes.KeyType<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 ObjValueToTypeMap<F> = ToObject<{
[K in keyof F]: ObjFieldToTuple<F[K]>;
}>;
export type Ensure<T, X> = T extends X ? T : X;
export declare class ObjValue<T extends classes.ObjType<any>> extends Value<T> implements Printable {
static new: (system?: ModuleType) => ObjValue<classes.ObjType<[]>>;
get system(): classes.ModuleType;
get t(): TypeBuilder;
keys(): string[];
get<K extends keyof ObjValueToTypeMap<UnObjType<T>>>(key: K): Value<ObjValueToTypeMap<UnObjType<T>>[K] extends classes.Type ? ObjValueToTypeMap<UnObjType<T>>[K] : classes.Type>;
fn<K extends keyof ObjValueToTypeMap<UnObjType<T>>>(key: K): FnValue<Ensure<ObjValueToTypeMap<UnObjType<T>>[K] extends classes.Type ? ObjValueToTypeMap<UnObjType<T>>[K] : classes.Type, classes.FnType<any, any, any>>>;
field<F extends classes.KeyType<any, any>>(field: F | ((t: TypeBuilder) => F), data: classes.ResolveType<UnObjFieldTypeVal<F>>): ObjValue<classes.ObjType<[...UnObjType<T>, F]>>;
add<K extends string, V extends classes.Type>(key: K, type: V | ((t: TypeBuilder) => V), data: classes.ResolveType<V>): ObjValue<classes.ObjType<[...UnObjType<T>, classes.KeyType<K, V>]>>;
set<K extends string, V extends classes.Type>(key: K, value: Value<V>): ObjValue<classes.ObjType<[...UnObjType<T>, classes.KeyType<K, V>]>>;
merge<O extends ObjValue<any>>(obj: O): ObjValue<classes.ObjType<[...UnObjType<T>, ...UnObjType<O['type']>]>>;
name(): string;
}