typescript - Hämta alla tillgängliga egenskaper i en klass
Jag har följande klass
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']
I grund och botten, när jag skapade en instans av A, satte jag inte värdet för propertyA. När SomeFunction(a) anropas bör den då returnera alla egenskaper som klass A kan ha, vilket inkluderar propertyA även om det inte har satts.
Object.getPropertyNames(a) returnerar bara ['id']
Vad ska koden för SomeFunction vara?
Svar #1
Om du inte anger ett värde för egenskapen kommer den inte att finnas på objektet. Det finns ingen metadata tillgänglig vid körning som säger "Denna egenskap är deklarerad men har aldrig tilldelats."
Du kommer att behöva välja ett standardvärde för propertyA och sätta det (kanske i en initializer vid deklarationen) om du vill säkerställa att varje instans av A har den egenskapen.
Till exempel, om du inte använder strikt nullkontroll, kan du göra så här:
class A {
id: number
propertyA: string = undefined
constructor(id: number) {
this.id = id
}
}
Det betyder att new A(42).propertyA fortfarande kommer att ge värdet undefined (som det gör med din befintliga A-klass), men egenskapen kommer faktiskt att existera och därför kan SomeFunction hitta den.
Livekopia:
class A {
id /* : number*/
propertyA /*: string*/ = undefined
constructor(id/*: number*/) {
this.id = id
}
}
console.log(Object.getOwnPropertyNames(new A(42)));Om du använder strikta nullkontroller måste du initiera det till en sträng.
Svar #2
Så länge värdet på egendomen inte är inställt kommer det inte att finnas i klassinstansen.
Här kan vi lista både id och propertyA, men bara när de är inställda:
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));