2012-10-02 26 views

cevap

4

Ben TypeScript Handbook: Decorators tökezlediğimde tam olarak aynı şeyi arıyordum.

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

ve bu gibi kullanmak:

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

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

Yani "Yöntem Dekoratörler" paragrafta onlar (ben sadece oradan-yapıştırma kopyalamak ediyorum) şöyle @enumerable dekoratör fabrikası, tanımlamak Bunu ele almanın başka bir yolu, dekoratörlerin kullanımıdır.

PS: Bu özellik experimentalDecorators bayrak tsc geçirilen veya tsconfig.json yılında ayarlanmasını gerektirir.

1

. Kullanım durumunuz ve gereksinimlerinizle ilgili ayrıntıları içeren CodePlex site numaralı telefondan bir sorun bildirmenizi öneririz. Bu kodu üretir

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

: Eğer --target ES5 ile derlemek yaparsanız

, böyle bir şey olabilir

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

Evet, mevcut koduma uyacak şekilde 'numaralandırılabilir', 'yapılandırılabilir' ve 'yazılabilir' özniteliklerini özelleştirmenin bir yolunu arıyorum. – Spongman

9

Sen daktilo get ve set kullanabilirsiniz, hangi Object.defineProperties'a derleyin.

Bu ECMAScript 5 özelliğidir, dolayısıyla ES3'ü hedefliyorsanız kullanamazsınız (derleyici için varsayılan değer). ES5'i hedeflemekten memnunsanız, emrinize --target ES5 ekleyin.

typescript:

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

için derler:

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

Ama enumerable ve yapılandırılabilir ayarı tam kontrol istiyorsanız - hala çiğ Object.defineProperties kodu kullanabilirsiniz.