2016-04-03 23 views
2

Neden bir sınıftaki Typescript'te dekoratörler veya ek açıklamalar kullandığımı merak ediyorum. Derleyici, sınıfın yeni türünü çıkaramaz. Dekoratör kullanmazsam ve ES5'te bunu yapmak için eski yolu kullanırsam (örn. Dekoratörü elle çağırırsam) açıkçası işe yarıyor. sorunu gösterirTypescript: Dekoratör kullanırken çıkarımda bulunma

Örneğin, burada bir örneği: eski yol ile

function decorate(Target: typeof Base): IExtendedBaseConstructor { 
    return class extends Target implements IExtendedBase { 
    public extendedtMethod(): number { 
     return 3; 
    } 
    }; 
} 

interface IBase { 
    baseMethod(): number; 
} 

interface IExtendedBase extends Base { 
    extendedtMethod(): number; 
} 

interface IExtendedBaseConstructor { 
    new(): IExtendedBase; 
} 

@decorate 
class Base implements IBase { 
    public baseMethod(): number { 
    return 5; 
    } 
} 

const test = new Base(); 
test.baseMethod(); // OK 
test.extendedtMethod(); // NOT OK, typescript think, Base is still Base but we decorated it. 

, çalışır:

class Base implements IBase { 
    public baseMethod(): number { 
    return 5; 
    } 
} 

const ExtendedBase = decorate(Base); 

const test = new ExtendedBase(); 
test.baseMethod(); // OK 
test.extendedtMethod(); // OK 

peşin.

+0

Bu modelin avantajı nedir? [Bu kod] (https://jsfiddle.net/pcyybdt7/1/) anlamak için daha kolay değil mi? –

+0

Haklısınız. Bu durumda, bu model işe yaramaz. Fakat yeni ön uç çerçeveleri (angular2 gibi), yeni bileşenleri beyan etmek için miras yerine dekoratör kullanmayı seçti. – Cnode

+0

Kullanıcıya bir sınıf API'si oluşturması için yardımcı olan bir kütüphane yazdım (buna bazı parametreler enjekte edildi ve kullanışlı yöntemler eklendi). Bu yüzden, işlevsellik sağlayan bir soyut Api sınıfı ve api'yi 'meta-data' aracılığıyla çerçevem ​​içine kaydeden bir dekoratör ürettim. Benim kullanıcı yapmak gerekir Bu durumda : ' 'MyLib' @Api (...) ithalat {AbstractAPI, Api} sınıf UserApi AbstractAPI {}' Benim SO soru da bu ilişkilidir uzanır. Eğer uzantıları kaldırabilir ve her şeyi dekoratör '@ Api’ye dahil edebilirsem, son kullanıcı yazım hatası azalırdı. – Cnode

cevap

2

Şu an bu çalışmaz. Sınıf dekoratörlerinin sınıfın türünü değiştirmesine izin vermek için github üzerinde bir pending issue vardır.

Uygulanana kadar bahsettiğiniz "eski yol" işlemini yapmanızı tavsiye ederim.