typescript - Obține toate proprietățile disponibile ale unei clase


Am următoarea clasă

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']

Practically, când am creat o instanță a clasei A, nu am setat valoarea pentru propertyA. Când SomeFunction(a) este apelată, aceasta ar trebui să returneze toate proprietățile pe care le poate avea clasa A, inclusiv propertyA, chiar dacă nu a fost setată.

Object.getPropertyNames(a) returnează doar ['id']

Care ar trebui să fie codul pentru SomeFunction?

Răspuns #1

Decât dacă setați o valoare pentru proprietate, aceasta nu va exista pe obiect. Nu există metadate disponibile la rulare care să spună „Această proprietate este declarată, dar nu a fost niciodată atribuită.”

Va trebui să alegi o valoare implicită pentru propertyA și să o setezi (poate într-un initializer la declarație) dacă vrei să te asiguri că fiecare instanță a A are această proprietate.

De exemplu, dacă nu folosești verificări stricte pentru valoarea null, ai putea face asta:

class A {
  id: number
  propertyA: string = undefined

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

Asta înseamnă că new A(42).propertyA va continua să returneze valoarea undefined (așa cum se întâmplă cu clasa ta existentă A), dar proprietatea va exista de fapt și astfel SomeFunction o poate găsi.

Copie live:

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

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

Dacă folosești verificări stricte pentru null, va trebui să îl inițializezi cu un șir de caractere.

Răspunsul #2

Atâta timp cât valoarea proprietății nu este setată, aceasta nu va exista în instanța clasei.

Aici, putem enumera atât id, cât și propertyA, dar doar atunci când sunt setate:

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));