如何在TypeScript中自定义属性

时间:2012-10-02 18:40:59

标签: typescript defineproperty

如何让TypeScript发出属性定义,例如:

Object.defineProperties(this, {
    view: {
        value: view,
        enumerable: false,
        writable: false,
        configurable: false
    },
});

3 个答案:

答案 0 :(得分:9)

您可以在TypeScript中使用getset,并将其编译为Object.defineProperties

这是ECMAScript 5的一项功能,因此如果您的目标是ES3(编译器的默认设置),则无法使用它。如果您乐意定位ES5,请在命令中添加--target ES5

打字稿:

class MyClass {
    private view;
    get View() { return this.view; }
    set View(value) { this.view = value }
}

编译为:

var MyClass = (function () {
    function MyClass() { }
    Object.defineProperty(MyClass.prototype, "View", {
        get: function () {
            return this.view;
        },
        set: function (value) {
            this.view = value;
        },
        enumerable: true,
        configurable: true
    });
    return MyClass;
})();

但如果您想完全控制设置可枚举和可配置 - 您仍然可以使用原始Object.defineProperties代码。

答案 1 :(得分:7)

当我偶然发现TypeScript Handbook: Decorators时,我正在寻找完全相同的东西。在"方法修饰器"他们定义@enumerable装饰工厂的段落,看起来像这样(我只是从那里复制粘贴):

function enumerable(value: boolean) {
    return function (target: any, propertyKey: string, descriptor: PropertyDescriptor) {
        descriptor.enumerable = value;
    };
}

他们像这样使用它:

class Greeter {
    greeting: string;
    constructor(message: string) {
        this.greeting = message;
    }

    @enumerable(false)
    greet() {
        return "Hello, " + this.greeting;
    }
}

另一种解决方法是使用装饰器。

<强> PS: 此功能需要将experimentalDecorators标记传递到tsc或在tsconfig.json中设置。

答案 2 :(得分:1)

如果您希望像这样发出所有属性,则目前不支持此功能。我建议在CodePlex site提交一个问题,详细说明您的用例和要求。

如果您使用--target ES5进行编译,则可以使用以下内容:

class n {
    get foo() { return 3; }
    bar() { return 5; }
}

产生此代码:

var n = (function () {
    function n() { }
    Object.defineProperty(n.prototype, "foo", {
        get: function () {
            return 3;
        },
        enumerable: true,
        configurable: true
    });
    n.prototype.bar = function () {
        return 5;
    };
    return n;
})();