UNPKG

bootstrap-vue-3

Version:

Early (but lovely) implementation of Vue 3, Bootstrap 5 and Typescript

45 lines (41 loc) 1.51 kB
/** * Removes properties from an object, based on the values in an array, and returns the new object. * Equivalent to an object version of TS Omit<> * * @param {Record<PropertyKey, unknown>} objToPluck * @param {ReadonlyArray<PropertyKey>} keysToPluck * @returns */ export const omit = <A extends Record<PropertyKey, unknown>, B extends ReadonlyArray<PropertyKey>>( objToPluck: A, keysToPluck: B ): Omit<A, B[number]> => Object.keys(objToPluck) .filter((key) => !keysToPluck.includes(key)) .reduce((result, key) => ({...result, [key]: objToPluck[key]}), {} as Omit<A, B[number]>) /** * Convenience method to create a read-only descriptor * * @returns */ export const readonlyDescriptor = () => ({enumerable: true, configurable: false, writable: false}) /** * Deeply clones an item * * @param {T} source * @returns */ export const cloneDeep = <T>(source: T): T => Array.isArray(source) ? source.map((item) => cloneDeep(item)) : source instanceof Date ? new Date(source.getTime()) : source && typeof source === 'object' ? Object.getOwnPropertyNames(source).reduce((o, prop) => { Object.defineProperty(o, prop, Object.getOwnPropertyDescriptor(source, prop) ?? {}) o[prop] = cloneDeep((source as unknown as {[key: string]: unknown})[prop]) return o }, Object.create(Object.getPrototypeOf(source))) : source export const cloneDeepAsync = <T>(source: T): Promise<T> => new Promise((resolve) => resolve(cloneDeep(source)))