import { ObjectInterface } from './interface'; let cache = new Map(); function copy(target: string | ObjectInterface | number | Array) { const type = {}.toString.call(target); switch (type) { case '[object Number]': case '[object String]': return target; case '[object Object]': return copyObject(target as ObjectInterface); case '[object Array]': return copyArray(target as Array); } } function copyObject(target: ObjectInterface) { if (cache.has(target)) { return cache.get(target); } let result: ObjectInterface = {}; cache.set(target, result); Object.keys(target).forEach((key) => { result[key] = copy(target[key]); }); return result; } function copyArray(target: Array) { if (cache.has(target)) { return cache.get(target); } let result = new Array(); cache.set(target, result); for (let i = 0; i < target.length; i++) { result[i] = copy(target[i]); } return result; } export { copy };