type ObjectType = Record type PickByValue = // From https://stackoverflow.com/a/55153000 Pick type ObjectEntries = // From https://stackoverflow.com/a/60142095 { [K in keyof OBJ_T]: [keyof PickByValue, OBJ_T[K]] }[keyof OBJ_T][] export const objectKeys = (obj: O) => Object.keys(obj) as Array export function objectEntries( obj: OBJ_T ): ObjectEntries { return Object.entries(obj) as ObjectEntries } type EntriesType = | [PropertyKey, unknown][] | ReadonlyArray // Existing Utils type DeepWritable = { -readonly [P in keyof OBJ_T]: DeepWritable } type UnionToIntersection = // From https://stackoverflow.com/a/50375286 (UNION_T extends any ? (k: UNION_T) => void : never) extends (k: infer I) => void ? I : never // New Utils type UnionObjectFromArrayOfPairs = DeepWritable extends (infer R)[] ? R extends [infer key, infer val] ? { [prop in key & PropertyKey]: val } : never : never type MergeIntersectingObjects = { [key in keyof ObjT]: ObjT[key] } type EntriesToObject = MergeIntersectingObjects< UnionToIntersection> > export function objectFromEntries( arr: ARR_T ): EntriesToObject { return Object.fromEntries(arr) as EntriesToObject }