javascript - Kontrollera om en typescript-klass har setter/getter


Jag har en TypeScript-klass som har följande egenskaper:

export class apiAccount  {
    private _balance : apiMoney;
    get balance():apiMoney {
        return this._balance;
    }
    set balance(value : apiMoney) {
        this._balance = value;
    }

    private _currency : string;
    get currency():string {
        return this._currency;
    }
    set currency(value : string) {
        this._currency = value;
    }
    ...

Jag behöver skapa en tom instans av den här klassen:

let newObj = new apiAccount();

Och sedan kontrollera om det har en setter för "currency", till exempel. Jag trodde att detta är precis vad getOwnPropertyDescriptor gör, men tydligen hade jag fel:

Object.getOwnPropertyDescriptor(newObj, 'currency')
Object.getOwnPropertyDescriptor(newObj, '_currency')

Båda dessa returnerar undefined. Men Chrome verkar göra det! När jag hovrar över instansen visar den mig egenskaperna och visar dem som undefined. Hur kan jag få en lista över de egenskapsnamnen, eller kontrollera om egenskapsbeskrivaren finns i objektet?

Svar #1

Problemet är att Object.getOwnPropertyDescriptor - som namnet antyder - endast returnerar beskrivningar av ett objekts egna egenskaper. Det vill säga: endast egenskaper som är direkt tilldelade det objektet, inte de som kommer från något av objekten i dess prototypkedja.

I ditt exempel är currency-egenskapen definierad på apiAccount.prototype, inte på newObj. Följande kodexempel visar detta:

class apiAccount {
    private _currency : string;
    get currency():string {
        return this._currency;
    }
    set currency(value : string) {
        this._currency = value;
    }
}

let newObj = new apiAccount();
console.log(Object.getOwnPropertyDescriptor(newObj, 'currency')); // undefined
console.log(Object.getOwnPropertyDescriptor(apiAccount.prototype, 'currency')); // { get, set, ... }

Om du vill hitta en egenskapsbeskrivare någonstans i ett objekts prototypkedja, behöver du loopa med Object.getPrototypeOf:

function getPropertyDescriptor(obj: any, prop: string) : PropertyDescriptor {
    let desc;
    do {
        desc = Object.getOwnPropertyDescriptor(obj, prop);
    } while (!desc && (obj = Object.getPrototypeOf(obj)));
    return desc;
}

console.log(getPropertyDescriptor(newObj, 'currency')); // { get, set, ... }

Relaterade artiklar