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 function objectEntries(obj: OBJ_T): ObjectEntries { return Object.entries(obj) as ObjectEntries } export function objectFromEntries(arr: ARR_T): EntriesToObject { return Object.fromEntries(arr) as EntriesToObject } export type EntriesType = [PropertyKey, unknown][] | readonly (readonly [PropertyKey, unknown])[] export type DeepWritable = { -readonly [P in keyof OBJ_T]: DeepWritable } export type UnionToIntersection = // From https://stackoverflow.com/a/50375286 (UNION_T extends any ? (k: UNION_T) => void : never) extends (k: infer I) => void ? I : never export type UnionObjectFromArrayOfPairs = DeepWritable extends (infer R)[] ? R extends [infer key, infer val] ? { [prop in key & PropertyKey]: val } : never : never export type MergeIntersectingObjects = { [key in keyof ObjT]: ObjT[key] } export type EntriesToObject = MergeIntersectingObjects< UnionToIntersection> > export function objectKeys(obj: O) { return Object.keys(obj) as (keyof O)[] }