Skip to content

Instantly share code, notes, and snippets.

@Fleshgrinder
Created January 14, 2026 10:34
Show Gist options
  • Select an option

  • Save Fleshgrinder/18afdaad33d4fbbcea54b2e72a444a8b to your computer and use it in GitHub Desktop.

Select an option

Save Fleshgrinder/18afdaad33d4fbbcea54b2e72a444a8b to your computer and use it in GitHub Desktop.
TypeScript: type-safe `Object` `entries`, `fromEntries`, `keys`, and `values` functions
/** Type-preserving runtime wrapper over {@link Object#entries()}. */
export function objectEntries<T extends Record<PropertyKey, unknown>>(
o: T,
): T extends unknown ? { [K in keyof T]-?: K extends string ? [K, T[K]] : never }[keyof T][] : never {
// eslint-disable-next-line @typescript-eslint/no-unsafe-type-assertion
return Object.entries(o) as ReturnType<typeof objectEntries<T>>;
}
/** Type-preserving runtime wrapper over {@link Object#fromEntries()}. */
export function objectFromEntries<T extends readonly (readonly [PropertyKey, unknown])[]>(
entries: T,
): { [E in T[number] as E[0] extends number ? `${E[0]}` : E[0]]: E[1] } {
// eslint-disable-next-line @typescript-eslint/no-unsafe-type-assertion
return Object.fromEntries(entries) as ReturnType<typeof objectFromEntries<T>>;
}
/** Type-preserving runtime wrapper over {@link Object#keys}. */
export function objectKeys<T extends Record<PropertyKey, unknown>>(
o: T,
): T extends unknown ? { [K in keyof T]-?: K extends string ? K : never }[keyof T][] : never {
// eslint-disable-next-line @typescript-eslint/no-unsafe-type-assertion
return Object.keys(o) as ReturnType<typeof objectKeys<T>>;
}
/** Type-preserving runtime wrapper over {@link Object#values}. */
export function objectValues<T extends Record<PropertyKey, unknown>>(
o: T,
): T extends unknown ? { [K in keyof T]-?: K extends string ? T[K] : never }[keyof T][] : never {
// eslint-disable-next-line @typescript-eslint/no-unsafe-type-assertion
return Object.values(o) as ReturnType<typeof objectValues<T>>;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment