Получить все доступные свойства класса - PullRequest
2 голосов
/ 12 марта 2019

У меня есть следующий класс

class A {
  id: number
  propertyA: string

  constructor(id: number) {
    this.id = id
  }
}

let a = new A(3)

console.log(SomeFunction(a))
// expected output = ['id', 'propertyA']

В основном, когда я создал экземпляр A, я не установил значение для свойства A.Когда вызывается SomeFunction(a), он должен возвращать все свойства класса A, которые включают propertyA, даже если он не был установлен.

Object.getPropertyNames(a) возвращает только ['id']

Каким должен быть код SomeFunction?

Ответы [ 2 ]

2 голосов
/ 12 марта 2019

Если вы не установите значение для свойства, оно не будет существовать для объекта.Во время выполнения нет доступных метаданных, которые сообщают: «Это свойство объявлено, но оно никогда не было назначено».

Вам нужно будет выбрать значение по умолчанию для propertyA и установить его (возможно, в инициализаторе надекларации), если вы хотите убедиться, что каждый экземпляр A имеет это свойство.

Например, если вы не используете строгие проверки на ноль, вы можете сделать это:

class A {
  id: number
  propertyA: string = undefined

  constructor(id: number) {
    this.id = id
  }
}

Это означает, что new A(42).propertyA будет продолжать предоставлять значение undefined (как это происходит с существующим классом A), но свойство действительно будет существовать, и SomeFunction сможет его найти.

Live Copy:

class A {
  id /* : number*/
  propertyA /*: string*/ = undefined

  constructor(id/*: number*/) {
    this.id = id
  }
}
console.log(Object.getOwnPropertyNames(new A(42)));

Если вы используете строгие нулевые проверки, вам нужно инициализировать его в строку.

1 голос
/ 12 марта 2019

Пока значение свойства не установлено, оно не будет существовать в экземпляре класса.

Здесь мы можем перечислить как id, так и propertyA, но только когда они установлены:

function showProps(obj) {
  return Object.keys(obj);
}

class A {
  constructor(id, propA) {
    this.id = id;
    if (propA)
      this.propertyA = 0;
  }
}

const a = new A(3);
const b = new A(3, 1);

console.log(showProps(a));
console.log(showProps(b));
...