export type Entry = { [K in keyof T]: [K, T[K]] }[keyof T] export type Entries = Entry[] export function entries(x: T): Entries { return Object.entries(x) as Entries } export function fromEntries(es: Entries): T { return Object.fromEntries(es) as unknown as T } export type RequiredEntry = Exclude< { [K in keyof T]: [K, Exclude] }[keyof T], undefined > export type RequiredEntries = RequiredEntry[] export function requiredEntries(x: T): RequiredEntries { return entries(x).filter( (entry): entry is RequiredEntry => entry?.[1] !== undefined, ) } export function prioritiseKeys(obj: T, keys: (keyof T)[]): T { const es = entries(obj) const newEs = [ ...keys.flatMap((key) => es.filter(([esK]) => esK === key)), ...es.filter(([esK]) => !keys.includes(esK)), ] as Entries return fromEntries(newEs) }