@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
TypeScript
/**
* 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 {};