检查typescript类是否有setter / getter

时间:2016-06-05 14:52:47

标签: javascript typescript

我有一个打字稿类,它具有以下属性:

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;
    }
    ...

我需要创建此类的空白实例:

let newObj = new apiAccount();

然后检查它是否具有"货币"的设置器。 我认为这正是getOwnPropertyDescriptor所做的,但显然我错了:

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

这两个都返回undefined。但铬似乎做到了!当我将鼠标悬停在实例上时,它会向我显示属性,并将它们显示为未定义。如何获取这些属性名称的列表,或检查对象中是否存在属性描述符? enter image description here

1 个答案:

答案 0 :(得分:8)

"问题"是Object.getOwnPropertyDescriptor - 顾名思义 - 只返回对象自己的属性的描述符。也就是说:只有直接分配给该对象的属性,来自其原型链中某个对象的属性。

在您的示例中,currency属性在apiAccount.prototype上定义,而不在newObj上定义。以下代码段演示了这一点:

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, ... }

如果要在对象的原型链中的任何位置找到属性描述符,则需要使用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, ... }