type Mutable = { -readonly [P in keyof T]: T[P] } interface Picker { (obj: O, keys: K[]): Mutable> >(obj: O, keysOrMap: M): Mutable< { [K in keyof M]: O[M[K]] } > } export const pick: Picker = < O, K extends keyof O, M extends Record >( obj: O, keysOrMap: K[] | M, ): Mutable< | Pick | { [K in keyof M]: O[M[K]] } > => { const mapEntries = Array.isArray(keysOrMap) ? keysOrMap.map((key) => [key, key]) as [string, keyof O][] : Object.entries(keysOrMap) return Object.fromEntries( mapEntries.map(([key, value]) => [key, obj[value]]), ) as Mutable< | Pick | { [K in keyof M]: O[M[K]] } > }