firesage
Version:
🔥 Extremely High Precision Typescript Wrapper for Firestore Web, Providing Unparalleled Type Safe and Dev Experience
12 lines (11 loc) • 1.14 kB
TypeScript
import { FieldValues } from './fieldValue';
declare type DeepKeyHybridInner<T, K extends keyof T, Mode extends 'read' | 'write'> = K extends string ? T[K] extends FieldValues ? K : T[K] extends Record<string, unknown> ? Mode extends 'write' ? K | `${K}.${DeepKeyHybridInner<T[K], keyof T[K], Mode>}` : `${K}.${DeepKeyHybridInner<T[K], keyof T[K], Mode>}` : K : never;
export declare type DeepKeyHybrid<T, Mode extends 'read' | 'write'> = DeepKeyHybridInner<T, keyof T, Mode>;
declare type DeepValueHybrid<T, P extends DeepKeyHybrid<T, Mode>, Mode extends 'read' | 'write'> = P extends `${infer K}.${infer Rest}` ? K extends keyof T ? Rest extends DeepKeyHybrid<T[K], Mode> ? DeepValueHybrid<T[K], Rest, Mode> : never : never : P extends keyof T ? T[P] : never;
export declare type ObjectFlattenHybrid<Data> = Data extends Record<string, unknown> ? {
[K in DeepKeyHybrid<Data, 'write'>]-?: ObjectFlattenHybrid<DeepValueHybrid<Data, K, 'write'>>;
} : Data;
export declare type ObjectFlattenRead<Read extends Record<string, unknown>> = {
[K in DeepKeyHybrid<Read, 'read'>]: DeepValueHybrid<Read, K, 'read'>;
};
export {};