react-vmodel
Version:
a vue v-model like usage for react with ts prompt
76 lines (66 loc) • 2.86 kB
TypeScript
import { Dispatch } from 'react';
import { JSX } from 'react/jsx-runtime';
import { ReactNode } from 'react';
import { SetStateAction } from 'react';
declare type AllPaths<T> = IsAny<T> extends true ? string : T extends number | null | string | boolean | undefined ? undefined : T extends Array<infer E> ? `[${number}]` | (E extends object ? `[${number}].${AllPaths<Exclude<E, undefined>> extends string ? AllPaths<Exclude<E, undefined>> : never}` : never) : T extends object ? {
[K in keyof T]-?: K extends string ? `${K}` | `${K}${T[K] extends Array<any> ? "" : "."}${AllPaths<Exclude<T[K], undefined>> extends string ? AllPaths<Exclude<T[K], undefined>> : never}` : never;
}[keyof T] : never;
declare type IsAny<T> = unknown extends T ? [keyof T] extends [never] ? false : true : false;
export declare const makeVModel: <T = any>(state?: T, setState?: (value: T) => void) => {
<R extends object>(key?: ObjectKeys<T>, transform?: (value: any, onChange: (e: EventTarget | any) => void) => R): R;
<R extends object>(transform?: (value: any, onChange: (e: EventTarget | any) => void) => R): R;
number(key?: ObjectKeys<T>): {
value: any;
onChange: (e: EventTarget | any) => void;
};
trim(key?: ObjectKeys<T>): {
value: any;
onChange: (e: EventTarget | any) => void;
};
checked: {
(key?: ObjectKeys<T>, options?: {
trueValue?: any;
falseValue?: any;
value?: any;
}): {
value: any;
checked: boolean;
onChange: (e: EventTarget | any) => void;
};
(options?: {
trueValue?: any;
falseValue?: any;
value?: any;
}): {
value: any;
checked: boolean;
onChange: (e: EventTarget | any) => void;
};
};
checklist: {
(key?: ObjectKeys<T>, options?: {
value?: any;
}): {
value: any;
checked: boolean;
onChange: (e: EventTarget | any) => void;
};
(options?: {
value?: any;
}): {
value: any;
checked: boolean;
onChange: (e: EventTarget | any) => void;
};
};
};
export declare function Model<T = any>({ children, value, onChange }: Props<T>): JSX.Element;
export declare type ObjectKeys<T> = T extends Array<any> ? number | AllPaths<T> : AllPaths<T>;
declare type Props<T> = {
children: (vModel: VModel<T>, value: T, onChange: (value: T) => void) => ReactNode;
value?: T;
onChange?: (value: T) => void;
};
export declare const useVModel: <T>(value: T) => [VModel<T>, T, Dispatch<SetStateAction<T>>];
export declare type VModel<T> = ReturnType<typeof makeVModel<T>>;
export { }