import {type ObjectKeys} from './object-keys.js'; type ArrayOwnKeys = Exclude; type ArrayOwnStringKeys = Extract, string | number>; type ArrayEntryKey = number extends Type['length'] ? `${number}` | `${ArrayOwnStringKeys}` : `${ArrayOwnStringKeys}`; type ArrayEntryValue = number extends Type['length'] ? Type[number] | Type[ArrayOwnStringKeys] : Type[ArrayOwnStringKeys]; /** A strongly-typed version of `Object.entries()`. This is useful since `Object.entries()` always returns an array of `Array<[string, T]>`. This function returns a strongly-typed array of the entries of the given object. - [TypeScript issues about this](https://github.com/microsoft/TypeScript/pull/12253) @example ``` import {objectEntries} from 'ts-extras'; const stronglyTypedEntries = objectEntries({a: 1, b: 2, c: 3}); //=> Array<['a' | 'b' | 'c', number]> const untypedEntries = Object.entries({a: 1, b: 2, c: 3}); //=> Array<[string, number]> ``` @category Improved builtin */ // eslint-disable-next-line @typescript-eslint/no-restricted-types -- We intentionally use `object` to accept interfaces. // Intentionally unsafe cast to provide strongly-typed Object.entries(). export const objectEntries = Object.entries as { (value: Type): Array<[ArrayEntryKey, ArrayEntryValue]>; (value: Type): Array<[ObjectKeys, Required[Extract]]>; };