2012-10-02 128 views
10

如何获得打字稿发出属性定义,如自定义属性:如何打字稿

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

回答

4

当我偶然发现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标志传递给tsctsconfig.json设置。

1

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

如果你做的ES5 --target编译,你可以有这样的事情:

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; 
})(); 
+0

是啊,我正在寻找一种方法来定制'可枚举','可配置'和'可写'属性来匹配我现有的代码。 – Spongman

9

您可以使用打字稿及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代码。