Closed1

TypeScript でクラスを含むオブジェクトをディープコピーしたい

いなにわうどんいなにわうどん

JSON.parse(JSON.stringify(obj)) だと class 構文に対応できないため、ディープコピーを書く必要がある。

https://twitter.com/kyoto_mast21/status/1562160820561543168

雑な実装だけどこれで行けるっぽい。Object.assign する際にさらに search を呼び出す必要があることに注意。

export const deepCopy = <T>(root: T) => {
  const search = (obj: unknown): unknown => {
    if (obj === null) {
      return null;
    }
    if (Array.isArray(obj)) {
      return obj.map((item) => search(item));
    }
    if (typeof obj === "object") {
      return Object.assign(
        Object.create(Object.getPrototypeOf(obj)),
        Object.entries(obj).reduce(
          (previous, [key, value]) => ({ ...previous, [key]: search(value) }),
          {}
        )
      );
    }
    return obj;
  };
  return search(root) as T;
};

このスクラップは2022/08/24にクローズされました