@plurid/plurid-functions
Version:
General Utility Functions for Plurid Applications
33 lines (32 loc) • 1.82 kB
TypeScript
/**
* Based on https://stackoverflow.com/a/56416192/6639124
*/
export declare type AllValues<T extends Record<PropertyKey, PropertyKey>> = {
[P in keyof T]: {
key: P;
value: T[P];
};
}[keyof T];
export declare type InvertResult<T extends Record<PropertyKey, PropertyKey>> = {
[P in AllValues<T>['value']]: Extract<AllValues<T>, {
value: P;
}>['key'];
};
export declare type RecursivePartial<T> = {
[P in keyof T]?: RecursivePartial<T[P]>;
};
/**
* Based on https://dev.to/pffigueiredo/typescript-utility-keyof-nested-object-2pa3
*/
export declare type NestedKeyOf<ObjectType extends object> = {
[Key in keyof ObjectType & (string | number)]: ObjectType[Key] extends object ? `${Key}` | `${Key}.${NestedKeyOf<ObjectType[Key]>}` : `${Key}`;
}[keyof ObjectType & (string | number)];
/**
* https://github.com/ghoullier/awesome-template-literal-types#dot-notation-string-type-safe
*/
export declare type ExtractPathsLogic<T, Key extends keyof T> = Key extends string ? T[Key] extends Record<string, any> ? `${Key}.${ExtractPathsLogic<T[Key], Exclude<keyof T[Key], keyof any[]>> & string}` | `${Key}.${Exclude<keyof T[Key], keyof any[]> & string}` : never : never;
export declare type ExtractPathsRecursion<T> = ExtractPathsLogic<T, keyof T> | keyof T;
export declare type ExtractPaths<T> = ExtractPathsRecursion<T> extends string | keyof T ? ExtractPathsRecursion<T> : keyof T;
export declare type Split<S extends string, D extends string> = S extends `${infer T}${D}${infer U}` ? [T, ...Split<U, D>] : [S];
export declare type RootKey<S extends string> = Split<S, '.'>['length'] extends 1 ? true : false;
export declare type RecursiveOmit<ObjectType extends object, Omits extends NestedKeyOf<ObjectType> | NestedKeyOf<ObjectType>[]> = any;