Press n or j to go to the next uncovered block, b, p or k for the previous block.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 | 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 340x 340x 340x 340x 449x 449x 17x 741x 741x 449x 449x 449x 340x 340x 340x | import { Merge } from '../typing/merge'; import { TypeOf } from './type-of'; /** * **assign**s (deep copies) the values of all of the enumerable own properties * from one or more `sources` to a `target`. The last value within the last * `sources` object takes precedence over any previously encountered values. * * @param target - The `target` object to **assign** properties to. * @param sources - An array of `sources` from which to deep copy properties. * @typeParam T - The type of the `target` object. * @typeParam S - The types of the `sources` objects. * @returns The **assign**ed-to `target` object. * * @example * **assign** nested properties: * ```ts * import { assign } from '@sgrud/core'; * * assign( * { one: { one: true }, two: false }, * { one: { key: null } }, * { two: true } * ); * * // { one: { one: true, key: null }, two: true } * ``` */ export function assign< T extends Record<PropertyKey, any>, S extends Record<PropertyKey, any>[] >(target: T, ...sources: [...S]): T & Merge<S[number]> { for (const source of sources) { for (const key in source) { if (TypeOf.object(target[key]) && TypeOf.object(source[key])) { target[key] = assign({} as any, target[key], source[key]); } else { target[key] = source[key]; } } } return target as T & Merge<S[number]>; } |