UNPKG

@zarlex/ngx-accessor

Version:

This library provides an adapter to interact with Angular forms. It also provides an adapter to work with object signals and forms

30 lines (29 loc) 2.06 kB
/** * Verify Type * Returns the type of the nested object property that is accessed by path * uses solution by angular https://github.com/angular/angular/blob/14.0.0-rc.3/packages/forms/src/model/abstract_model.ts#L319 */ export type PropertyDoesNotExistError = never; type Navigate<T, K extends (Array<string | number>)> = T extends object ? (K extends [infer Head, ...infer Tail] ? (Head extends keyof T ? (Tail extends (string | number)[] ? [ ] extends Tail ? T[Head] : (Navigate<T[Head], Tail>) : PropertyDoesNotExistError) : PropertyDoesNotExistError) : PropertyDoesNotExistError) : PropertyDoesNotExistError; type CoerceStrArrToNumArr<S> = S extends [infer Head, ...infer Tail] ? Head extends `${number}` ? [number, ...CoerceStrArrToNumArr<Tail>] : [ Head, ...CoerceStrArrToNumArr<Tail> ] : [ ]; type Tokenize<S extends string, D extends string> = string extends S ? string[] : S extends `${infer T}${D}${infer U}` ? [T, ...Tokenize<U, D>] : [ S ]; type Writeable<T> = { -readonly [P in keyof T]: T[P]; }; export type IsTokenized<S extends string, D extends string> = string extends S ? string[] : S extends `${infer T}${D}${infer U}` ? S : never; export type GetPropertyType<T, K> = K extends string ? GetPropertyType<T, CoerceStrArrToNumArr<Tokenize<K, '.'>>> : Writeable<K> extends Array<string | number> ? Navigate<T, Writeable<K>> : any; /** * Get property of object by path in dot notation */ export type GetProperty = <TObject, TPath extends string>(object: TObject, path: TPath) => GetPropertyType<TObject, TPath>; export type SimplePath<ObjectType extends object> = { [Key in keyof ObjectType & (string | number)]: ObjectType[Key] extends Array<Array<any>> ? `${Key}` : ObjectType[Key] extends Array<object> ? `${Key}` | `${Key}.${SimplePath<ObjectType[Key][0]>}` : ObjectType[Key] extends Array<any> ? `${Key}` : ObjectType[Key] extends (File | Date | Function) ? `${Key}` : ObjectType[Key] extends object ? `${Key}` | `${Key}.${SimplePath<ObjectType[Key]>}` : `${Key}`; }[keyof ObjectType & (string | number)]; export {};