在typescript中获取类的属性

Ram*_*feh 13 javascript typescript

我有以下课程:

export class Test {

        private _rowsCount: string;
        public get RowsCount(): string {
            return this._rowsCount;
        };
        public set RowsCount(value: string) {
            this._rowsCount = value;
        };

        private _rowsCount2: string;
        public get RowsCount2(): string {
            return this._rowsCount2;
        };
        public set RowsCount2(value: string) {
            this._rowsCount2 = value;
        };
    }
Run Code Online (Sandbox Code Playgroud)

我需要迭代特定类中的属性,我尝试了以下内容:

Object.keys(this).forEach((key)=> {
    console.log(key);
});
Run Code Online (Sandbox Code Playgroud)

但是这个问题只是在private字段上进行迭代,我也尝试了以下我得到了所有的methodsproperties:

    for (var property in this) {
        if (this.hasOwnProperty(property)) {
            console.log(property);                
        }
    }
Run Code Online (Sandbox Code Playgroud)

有没有人有办法解决吗?

谢谢!

Nit*_*mer 7

如果你只需要获得getter/setter,那么你需要做类似的事情:

class Test {
    ...

    public static getGetters(): string[] {
        return Object.keys(this.prototype).filter(name => {
            return typeof Object.getOwnPropertyDescriptor(this.prototype, name)["get"] === "function"
        });
    }

    public static getSetters(): string[] {
        return Object.keys(this.prototype).filter(name => {
            return typeof Object.getOwnPropertyDescriptor(this.prototype, name)["set"] === "function"
        });
    }
}

Test.getGetters(); // ["RowsCount", "RowsCount2"]
Test.getSetters(); // ["RowsCount", "RowsCount2"]
Run Code Online (Sandbox Code Playgroud)

(游乐场代码)


您可以将静态方法放在基类中,然后在扩展它时,子类也将具有这些静态方法:

class Base {
    public static getGetters(): string[] {
        return Object.keys(this.prototype).filter(name => {
            return typeof Object.getOwnPropertyDescriptor(this.prototype, name)["get"] === "function"
        });
    }

    public static getSetters(): string[] {
        return Object.keys(this.prototype).filter(name => {
            return typeof Object.getOwnPropertyDescriptor(this.prototype, name)["set"] === "function"
        });
    }
}

class Test extends Base {
   ...
}

Test.getGetters(); // work the same
Run Code Online (Sandbox Code Playgroud)

(游乐场代码)

如果您希望这些方法是实例方法,那么您可以这样做:

class Base {
    public getGetters(): string[] {
        return Object.keys(this.constructor.prototype).filter(name => {
            return typeof Object.getOwnPropertyDescriptor(this.constructor.prototype, name)["get"] === "function"
        });
    }

    public getSetters(): string[] {
        return Object.keys(this.constructor.prototype).filter(name => {
            return typeof Object.getOwnPropertyDescriptor(this.constructor.prototype, name)["set"] === "function"
        });
    }
}
Run Code Online (Sandbox Code Playgroud)

改变的是,而不是使用this.prototypethis.constructor.prototype.
然后你简单地说:

let a = new Test();
a.getGetters(); // ["RowsCount", "RowsCount2"]
Run Code Online (Sandbox Code Playgroud)

(游乐场代码)


编辑

基于@Twois的评论,他指出在定位es6时它不起作用,这里有一个可行的版本:

class Base {
    public static getGetters(): string[] {
        return Reflect.ownKeys(this.prototype).filter(name => {
            return typeof Reflect.getOwnPropertyDescriptor(this.prototype, name)["get"] === "function";
        }) as string[];
    }

    public static getSetters(): string[] {
        return Reflect.ownKeys(this.prototype).filter(name => {
            return typeof Reflect.getOwnPropertyDescriptor(this.prototype, name)["set"] === "function";
        }) as string[];
    }
}
Run Code Online (Sandbox Code Playgroud)

主要区别:使用Reflect.ownKeys(this.prototype)而不是Object.keys(this.prototype).

  • 如果目标是 es6 或更高版本,则这不再起作用,因为 TS 现在使用本机 js getter 和 setter。 (2认同)