/** * Toolkit - Type Helpers * * TypeScript utility types and helper functions. */ /** * Make specific properties optional */ export type PartialBy = Omit & Partial>; /** * Make specific properties required */ export type RequiredBy = Omit & Required>; /** * Deep partial (makes all nested properties optional) */ export type DeepPartial = T extends object ? { [P in keyof T]?: DeepPartial } : T; /** * Extract keys of a certain type */ export type KeysOfType = { [K in keyof T]: T[K] extends U ? K : never; }[keyof T]; /** * Ensure all keys of a type are present */ export function ensureKeys>( obj: Partial, keys: (keyof T)[] ): obj is T { return keys.every(key => key in obj); } /** * Pick properties by value type */ export type PickByValue = Pick< T, { [K in keyof T]: T[K] extends V ? K : never; }[keyof T] >; /** * Safely access nested property */ export function getNestedProperty( obj: unknown, path: string, defaultValue?: T ): T | undefined { const keys = path.split("."); let current: any = obj; for (const key of keys) { if (current === null || current === undefined || typeof current !== "object") { return defaultValue; } current = current[key]; } return current ?? defaultValue; }