funval
Version:
A minimalist library for data validation using functions interfaces.
18 lines (17 loc) • 1.01 kB
TypeScript
import { AllowPartial, AnyType, FunctionType, Primitive, ResolvedValue } from './utils';
export declare type Output<T> = [T] extends [FunctionType] ? ResolvedValue<ReturnType<T>> : [T] extends [Primitive] ? T : [T] extends [RegExp] ? string : [T] extends [object] ? {
[K in keyof T]: Output<T[K]>;
} : never;
declare type OptionalInputKeys<T> = Exclude<{
[K in keyof T]: [T[K]] extends [FunctionType] ? Parameters<T[K]> extends Required<Parameters<T[K]>> ? never : K : undefined extends T[K] ? K : never;
}[keyof T], undefined>;
declare type RequiredInputKeys<T> = Exclude<keyof T, OptionalInputKeys<T>>;
export declare type Input<T> = T extends FunctionType ? Parameters<T>[0] : T extends Primitive ? T : T extends RegExp ? string : T extends Array<AnyType> ? {
[K in keyof T]: Input<T[K]>;
} : T extends object ? {
[K in RequiredInputKeys<T>]: Input<T[K]>;
} & {
[K in OptionalInputKeys<T>]?: Input<T[K]>;
} : never;
declare type Type<T> = AllowPartial<Output<T>>;
export default Type;