Angular v2 глубокое копирование / клонирование typescript с геттерами

#angular #typescript #deep-copy

#angular #typescript #глубокое копирование

Вопрос:

Как я могу скопировать / клонировать класс typescript? Родительский класс содержит вложенный класс, а также коллекцию вложенного класса. Каждый тип класса содержит геттер. Я хотел бы, чтобы скопированный класс не потерял геттеры, а вложенный класс и элементы массива имели новую ссылку.

Мои проблемы в том, что JSON.parse(JSON.stringify( obj )); не скопированы геттеры. и Object.assign(target, soure); скопировали геттеры, но элементы массива сохраняют исходные ссылки.

Вот структура классов

 export interface IClassA {
  code: number;
  description: string;
}

export class ClassA implements IClassA {
  code: number;
  description: string;
  get descrAndCode() {
    return 'Getter A '   this.description   ':'   this.code;
  }
}

export interface IClassB {
  name: string;
  code: number;
  classList: Array<ClassA>;
}

export class ClassB implements IClassB {
  name: string;
  code: number;
  get codeAndName(): string {
    return 'Getter B'   this.code   ':'   this.name;
  }
  nested: ClassA;
  classList: Array<ClassA>;  
}
  

Ответ №1:

Другой способ глубокого копирования объекта с getter amp; setter использованием метода Lodash clonedeep()

 import * as cloneDeep from 'lodash/cloneDeep';
...
let foo = cloneDeep(bar);
  

Надеюсь, это поможет!

Комментарии:

1. Спасибо за ваш ответ, но я бы не хотел использовать внешние библиотеки.

2. Эта библиотека уже доступна в вашем angular. Вам не нужно устанавливать это

3. Я попробовал, это работает. Но я не видел, когда включал Lodash в Angular. Какая была первая версия, которая содержала это?

4. Что произойдет, если мы создадим проект без CLI, проект будет содержать его? И если мы создадим производственную сборку в этом случае, мы должны включить ее в package.json, я прав?

5. по умолчанию это требуется для всех приложений angular. без этой библиотеки ваш проект angular не будет работать. так что не беспокойтесь, вы можете его использовать