Type-safe Object.entries for typed objects
TypeScript
// Keep key and value types correlated when reading or rebuilding objects.
type Entry<T> = { [K in keyof T]-?: [K, T[K]] }[keyof T];
function typedEntries<T extends object>(source: T): Array<Entry<T>> {
return Object.entries(source) as unknown as Array<Entry<T>>;
}
type Flags = { dark: boolean; compact: boolean };
const flags: Flags = { dark: true, compact: false };
for (const [name, enabled] of typedEntries(flags)) {
console.log(`${name}=${enabled}`); // name: 'dark' | 'compact'
}
const toggled = Object.fromEntries(
typedEntries(flags).map(([name, enabled]) => [name, !enabled] as const),
) as Flags;
console.log(toggled); // { dark: false, compact: true }