Typescript / JSX - назначить экземпляр класса по ссылке - PullRequest
0 голосов
/ 27 ноября 2018

По сути, я хочу иметь возможность получить доступ к свойству объекта по ссылке.Посмотрите на приведенный ниже код:

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 поддерживает только передачу по ссылке для объектов и массивов, но как насчет экземпляров классов?

Я знаю, когда Babel преобразует класс в обычный Javascript, они рассматриваются как функции, но функция не является примитивным типом - это объект, который можно вызвать, так что это не работает, и что будетрешение?

1 Ответ

0 голосов
/ 28 ноября 2018

Однако, когда я присваиваю 'c' либо 'a.first', либо 'a.second', он проходит только по значению

Да, присваивание всегда меняет значениеВ левой части = нет способа изменить его в 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;
}
...