如何在TypeScript中创建值属性

时间:2014-11-26 16:29:51

标签: javascript typescript

TypeScript具有用于定义访问者属性的内置功能

class Test {
    constructor(private value: number = 123) {
    }

    public get Value(): number {
        return this.value;
    }

    public set Value(value: number) {
        this.value = value;
    }
}

编译器输出

var Test = (function () {
    function Test(value) {
        if (value === void 0) { value = 123; }
        this.value = value;
    }
    Object.defineProperty(Test.prototype, "Value", {
        get: function () {
            return this.value;
        },
        set: function (value) {
            this.value = value;
        },
        enumerable: true,
        configurable: true
    });
    return Test;
})();

JavaScript还支持值属性

Object.defineProperty(someObj, "MyValueProperty", {
    // The key here is value as opposed to get and set.
    value: 5
    enumerable: true,
    configurable: false
});

如何使用TypeScript定义值属性?

注意:我注意到我正在指向另一个有关TypeScript getter和setter的stackoverflow问题。这不是我想要的。我想知道如何创建实现value getset的属性!

2 个答案:

答案 0 :(得分:3)

您可以执行以下操作:

class Test {
    Value : number;
}

Object.defineProperty(Test.prototype, "Value", {
    value: 5,
    enumerable: true,
    configurable: false
});

var t = new Test();
t.Value = 54;
console.log(t.Value); // 5

但为什么不直接返回get函数中的值?

class Test {
    public get Value(): number {
        return 5;
    }
}

var t = new Test();
t.Value = 54;
console.log(t.Value); // 5

使用装饰器

如果你真的想要一个value属性,那么更优雅的方法是创建一个可重用的装饰器:

function ValueProperty(value: any) {
    return (target: Object, propertyKey: string) => {
        Object.defineProperty(target, propertyKey, {
            value,
            enumerable: true,
            configurable: false
        });
    };
}

然后使用它:

class Test {
    @ValueProperty(5)
    Value: number;
}

new Test().Value; // 5

答案 1 :(得分:1)

Typescript目前不支持。查看语言规范和typescript编译器的Emitter类,我找不到任何表明支持值属性的东西。

https://github.com/Microsoft/TypeScript/blob/9a89147587c06ba51181ff2ee5ade69a98b171ea/src/services/compiler/emitter.ts#L2402

我想您唯一的选择是使用原始Javascript和Object.defineProperty来定义它们。