type ConvertUndefined = OrUndefined<{ [K in keyof T as undefined extends T[K] ? K : never]-?: T[K] }> type OrUndefined = { [K in keyof T]: T[K] | undefined } type PickRequired = { [K in keyof T as undefined extends T[K] ? never : K]: T[K] } type ConvertPick = ConvertUndefined & PickRequired export const pick = ( obj: Obj, keys: Keys[], /** Whether to filter out explicit `undefined` values */ filterUndefined = true, ): ConvertPick<{ [K in Keys]: Obj[K] }> => { return keys.reduce((acc, key) => { const val = obj[key] if (val === undefined && filterUndefined) return acc acc[key] = val return acc }, {} as any) }