2016-04-03 16 views
3

TypeScript 1.8'de, yalnızca bir dizi sonlu değerden biri olabilen bir türü bildirmenize izin veren "dizgi değişmez türü" adı verilen yeni bir tür eklediler. bunlar vermek örnektir:TypeScript'te bir sınıf içinde bir tür (String literal union) tanımlamak mümkün mü?

type Easing = "ease-in" | "ease-out" | "ease-in-out"; 

Ancak, bütün örneklerde, tip dış bu kullanılabilir veya diğer adları olmayan satır tanımlandığı sınıfın tanımlandığı ya olup. this question'a verilen cevaplarda (oldukça fazla) açıklandığı gibi, yazım adlarını içeren modüllere yazın.

Projemde, belirli sınıflarla eşleştirilen ve birden çok yerde kullanılan dize değişmezleri için tür takma adlarını tanımlamak istiyorum. Tüketmekte olduğum API'ların yapısı nedeniyle, her birinin aynı ada sahip ancak farklı potansiyel değerlere sahip birden fazla sınıfı vardır. Kodumu düzgün bir şekilde saklamak istiyorum ve yardımcı olabilseydim, öneklerle (MyClassAPropertyValue, MyClassBPropertyValue, vb.) Bir dizi küresel türde bildirim içermem.

Yani, sınıf kapsamı içinde bir type bildirmek için herhangi bir yolu var mı (tercihen harici modüller tarafından tüketilebilecek şekilde)? Değilse, bu kullanım durumunu dolduracak yakın bir ikame veya planlanmış özellik var mı?


Kullanım örneği: Ben altta yatan API verilerini sarmak iki sınıfları

varsayalım. Her sınıf farklı verileri temsil eder, sadece aynı ada sahip bazı özelliklere sahip olurlar.

export class APIObjectA { 
    // Valid values in APIObjectA 
    public type Property1Value = "possible_value_A" | "possible_value_B"; 
    public type Property2Value = "possible_value_C" | "possible_value_D"; 

    // Here, "Property1Value" refers to the version in APIObjectA 
    public get property1(): Property1Value { 
     // Return value of property1 from underlying API data 
    } 

    public get property2(): Property2Value { 
     // ... 
    } 
} 

export class APIObjectB { 
    // Valid values in APIObjectB 
    public type Property1Value = "possible_value_E" | "possible_value_F"; 
    public type Property2Value = "possible_value_G" | "possible_value_H"; 

    // In this context, "Property1Value" refers to the version in APIObjectB 
    public get property1(): Property1Value { 
     // ... 
    } 

    public get property2(): Property2Value { 
     // ... 
    } 
} 

Ve her yerde türleri vardır, böylece daha sonra, ideal olarak, kodu tüketen bulunan belirli bir türdeki başvurmak mümkün olurdu: Ben tanımlayan özelliklerin bir yolu şöyle istiyorum

var myNewValue: APIObjectB.Property1Value = "possible_value_F"; 
+0

Sanırım ne istediğini anlıyorum, ancak bu tür kullanmayı nasıl amaçladığınızı gösteren bir kod ekleyebilir misiniz? – reduckted

cevap

1

Türleri doğrudan sınıf içinde tanımlayamazsınız (iç içe geçmiş sınıflar, enumlar veya dize değişmez türleri).

Ancak, this answer'da gösterildiği gibi, aynı ada sahip bir modülde iç içe türünü tanımlayarak bunu aşabilirsiniz.

export class APIObjectA { 
    // Here, "Property1Value" refers to the version in APIObjectA 
    public get property1(): APIObjectA.Property1Value { 
     // Return value of property1 from underlying API data 
    } 

    public get property2(): APIObjectA.Property2Value { 
     // ... 
    } 
} 

module APIObjectA { 
    // Valid values in APIObjectA 
    export type Property1Value = "possible_value_A" | "possible_value_B"; 
    export type Property2Value = "possible_value_C" | "possible_value_D"; 
} 

export class APIObjectB { 
    // In this context, "Property1Value" refers to the version in APIObjectB 
    public get property1(): APIObjectB.Property1Value { 
     // ... 
    } 

    public get property2(): APIObjectB.Property2Value { 
     // ... 
    } 
} 

module APIObjectB { 
    // Valid values in APIObjectB 
    export type Property1Value = "possible_value_E" | "possible_value_F"; 
    export type Property2Value = "possible_value_G" | "possible_value_H"; 
} 

Özelliklerin geri dönüş türleri için tam nitelikli adı kullanmanız gerekeceğini unutmayın. Örneğin, sadece Property1Value yerine APIObjectB.Property1Value kullanmanız gerekir.