【问题标题】:Typescript: Importing and Exporting by value or reference打字稿:按值或引用导入和导出
【发布时间】:2020-04-11 22:02:47
【问题描述】:

我正在将一些 Javascript 代码转换为 Typescript,但我陷入了基本的导入和导出:

所需的功能: 我希望能够在其他几个文件中导入“POST_Requirements”。每个调用 POST_Requirements.ORGANIZATION() 的文件都会收到一个新的实例 POST_Requirements 存储一个所需的变量。对此实例的任何编辑都不会影响文件内的其他实例或任何外部文件。

实际功能: 任何调用 POST_Requirements.ORGANIZATION() 的文件都会收到一个新实例。但是,如果文件 X 编辑其实例,则文件 Y 中的实例会经历相同的编辑。非常困惑,因为这可以通过使用“new”来防止

导出类: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 打印相同的内容

任何关于为什么这样做的见解将不胜感激

【问题讨论】:

  • 实例是独立的,但它们共享(通过引用)您传递给构造函数的相同数组,因此当您改变这些数组时(例如通过调用reverse)所有这些数组都会更改.您可以在构造函数中或在将其传递给构造函数之前复制数组。
  • 是的,就是这样!这让我被困了一个多小时,我爱你。

标签: javascript node.js typescript express export


【解决方案1】:

您可以使用对象克隆来确保它们指向不同的对象

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

这里是以 Angular 为例的 stackblitz https://stackblitz.com/edit/angular-wxvgus

【讨论】:

    猜你喜欢
    • 2017-02-06
    • 1970-01-01
    • 2020-04-19
    • 2023-02-09
    • 1970-01-01
    • 2016-07-13
    • 2019-02-21
    • 2017-09-23
    • 1970-01-01
    相关资源
    最近更新 更多