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.
Bu modelin avantajı nedir? [Bu kod] (https://jsfiddle.net/pcyybdt7/1/) anlamak için daha kolay değil mi? –
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
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