frontend-challenges
frontend-challenges copied to clipboard
442 - Deep Clone - typescript
index.ts
export function deepClone<T>(value: T): T {
if (typeof value !== "object" || value === null) {
return value;
}
if (Array.isArray(value)) {
return value.map((item) => deepClone(item)) as unknown as T;
}
const obj = value as Record<string, unknown>;
return Object.keys(obj).reduce<Record<string, unknown>>((acc, key) => {
acc[key] = deepClone(obj[key]);
return acc;
}, {}) as T;
}
index.test.ts
import { deepClone } from "./index";
describe("deepClone", () => {
it("clones nested objects and keeps structure independent", () => {
const obj = { a: 1, b: { c: 2 } };
const copy = deepClone(obj);
copy.b.c = 42;
expect(obj.b.c).toBe(2);
expect(copy.b.c).toBe(42);
});
it("clones arrays deeply", () => {
const arr = [1, [2, 3]];
const copy = deepClone(arr);
(copy[1] as number[])[0] = 99;
expect((arr[1] as number[])[0]).toBe(2);
});
it("returns primitives unchanged", () => {
expect(deepClone(123)).toBe(123);
expect(deepClone("abc")).toBe("abc");
});
});