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