Typescript/JSX - 通过引用分配 class 的实例

Typescript/JSX - Assign an instance of a class by reference

本质上,我希望能够通过引用访问对象的 属性。看看下面的代码;

class Point{
  x:number;
  y:number;
  constructor(x,y)
  {
    this.x=x;
    this.y=y;
  }
}

const a = { first: new Point(8,9), second: new Point(10,12) };
let someBool = true;

function modifyProperty(a) {
  let c = someBool? a.first: a.second;

  let newPoint = new Point(0,0);
  c = newPoint;         // Doesn't work

  someBool = !someBool;
}

modifyProperty(a);
console.log(a.first);

在此示例中,每当我调用 modifyProperty() 时,我想交替更改 'a' 中的两个属性之一。

但是,当我将 'c' 分配给 'a.first' 或 'a.second' 时,它仅按值传递。我想解决这个问题的唯一方法是使 属性 本身成为一个对象,如下所示:

 const a = { first: {value: new Point(8,9)}, second: {value: new Point(10,12)} };

然后我会直接调用 c.value = newPoint。这会起作用,但这不是一个好的解决方案,因为您必须为对象中的每个 属性 执行此操作。

有没有更好的方法通过引用获取这些属性?我知道 JS 只支持对象和数组的引用传递,但是 classes 的实例呢?

我知道当 Babel 将 class 转换为普通 Javascript 时,它们被视为函数,但函数不是原始类型 - 它是一个可调用的对象,所以不是这项工作,什么是解决方案?

However, when I assign 'c' to either 'a.first' or 'a.second', it only passes by value

是的,赋值总是改变=左边的东西的值, 在 Javascript 或 TypeScript 中无法更改它。

一种解决方法是将 属性 名称与 属性 所属的对象一起使用,而不是引用:

type Pair<T> = { first: T, second: T }

function modifyProperty(a: Pair<Point>) {
    let c: keyof Pair<Point> = someBool? 'first' : 'second'; 
    // keyof Pair<Point> type annotation means 
    // that only property names of Pair could be assigned to c  

    let newPoint = new Point(0,0);
    a[c] = newPoint;         

    someBool = !someBool;
}