/** * Adapted from: * @author https://gist.github.com/karol-majewski * @see https://gist.github.com/karol-majewski/b234a4aceb8884ccc1acf25a2e1ed16e */ import { UnionToIntersection } from '../UnionToIntersection' type Primitive = boolean | number | string | bigint | symbol | null | undefined type Narrowable = Primitive | object | {} type Entry = [K, V] type FromEntries< T extends Entry, K extends PropertyKey, V extends Narrowable > = UnionToIntersection< T extends [infer Key, infer Value] ? Key extends PropertyKey ? { [k in Key]: Value } : never : never > export function fromEntries< T extends Entry, K extends PropertyKey, V extends Narrowable >( entries: Iterable, ): { [k in keyof FromEntries]: FromEntries[k] } { return [...entries].reduce( (accumulator, [key, value]) => Object.assign(accumulator, { [key.toString()]: value, }), {} as FromEntries, ) }