2012-10-02 164 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代碼。