2012-10-02 28 views

Trả lời

4

Tôi đang tìm kiếm chính xác điều tương tự khi tôi tình cờ gặp TypeScript Handbook: Decorators. Trong "Phương pháp trang trí" đoạn họ xác định @enumerable nhà máy trang trí, trông như thế này (tôi chỉ cần sao chép-dán từ đó):

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

và họ sử dụng nó như thế này:

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

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

Vì vậy, một cách khác để giải quyết nó, là thông qua việc sử dụng các trang trí.

PS: Tính năng này đòi hỏi experimentalDecorators cờ để được thông qua để tsc hoặc thiết lập trong tsconfig.json.

1

này hiện không được hỗ trợ nếu bạn muốn tất cả các thuộc tính được phát ra như thế. Tôi khuyên bạn nên gửi một sự cố tại số CodePlex site cùng với chi tiết về trường hợp sử dụng và yêu cầu của bạn.

Nếu bạn làm biên dịch với --target ES5, bạn có thể có một cái gì đó như thế này:

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

nào tạo ra mã này:

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

vâng, tôi đang tìm cách tùy chỉnh thuộc tính 'có thể đếm', 'có thể định cấu hình' và 'có thể ghi' để khớp với mã hiện có của tôi. – Spongman

9

Bạn có thể sử dụng getset trong nguyên cảo, mà biên dịch thành Object.defineProperties.

Đây là một tính năng ECMAScript 5, vì vậy bạn không thể sử dụng nó nếu bạn đang nhắm mục tiêu ES3 (mặc định cho trình biên dịch). Nếu bạn vui lòng nhắm mục tiêu ES5, hãy thêm --target ES5 vào lệnh của bạn.

nguyên cảo:

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

Biên dịch để:

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

Nhưng nếu bạn muốn kiểm soát toàn bộ thiết lập đếm được và cấu hình - bạn vẫn có thể sử dụng liệu Object.defineProperties mã.

Các vấn đề liên quan