Машинопись: импорт и экспорт по значению или по ссылке - PullRequest
0 голосов
/ 12 апреля 2020

Я конвертирую некоторый код Javascript в Typescript, и я застреваю на базовом c импорте и экспорте:

Желаемая функциональность: я хочу иметь возможность импортировать POST_Requirements в нескольких другие файлы. Каждый файл, который вызывает POST_Requirements.ORGANIZATION (), получает новый экземпляр POST_Requirements, в котором хранится нужная переменная. Любое редактирование этого экземпляра не влияет на другие экземпляры внутри файла или любого внешнего файла.

Фактическая функциональность: любой файл, вызывающий POST_Requirements.ORGANIZATION (), получает новый экземпляр. Однако, если файл X редактирует свой экземпляр, экземпляр в файле Y подвергается такому же редактированию. Очень запутано, потому что это можно было бы предотвратить, используя «новый»

EXPORTED CLASS: post.requirements.ts

export class POST_Requirements {
  readonly text_fieldnames: Array<string>;
  constructor(
    file_fieldnames: Array<string>,
    text_fieldnames: Array<string>,
    max_file_size: number = 25 * MEGABYTE,
    max_fieldname_size: number = 200,
    max_field_size: number = KILOBYTE
  ) {
    this.file_fieldnames = file_fieldnames;
    this.text_fieldnames = text_fieldnames;
    this.max_file_size = max_file_size;
    this.max_fieldname_size = max_fieldname_size;
    this.max_field_size = max_field_size;
  }

  static ORGANIZATION(): POST_Requirements {
    return new POST_Requirements(
      ORGANIZATION_FILE_FIELDNAMES,
      ORGANIZATION_TEXT_FIELDNAMES
    );
  }
}

Отдельный файл:

let a: POST_Requirements = POST_Requirements.ORGANIZATION();
let b: POST_Requirements = POST_Requirements.ORGANIZATION();

let a_sub: Array<string> = a.text_fieldnames;
let b_sub: Array<string> = b.text_fieldnames;

console.log(a_sub)
console.log(b_sub)
a_sub.reverse();
console.log(a_sub)
console.log(b_sub)

a_sub и b_sub всегда печатает одно и то же значение. В отдельном файле c_sub печатает тот же

Любое понимание того, почему это происходит таким образом, будет высоко оценено

1 Ответ

0 голосов
/ 12 апреля 2020

Вы можете использовать клонирование объектов, чтобы убедиться, что они указывают на разные объекты

static ORGANIZATION(): POST_Requirements{
  let a = new POST_Requirements(["f1", "f2"], ["t1", "t2"]);
    return {...a}
}

Вот блик стека, использующий angular в качестве примера https://stackblitz.com/edit/angular-wxvgus

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...