frontend-challenges icon indicating copy to clipboard operation
frontend-challenges copied to clipboard

442 - Deep Clone - typescript

Open jsartisan opened this issue 2 months ago • 0 comments

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");
  });
});

jsartisan avatar Sep 16 '25 14:09 jsartisan