2016-03-26 8 views
4

Farz edelim ki, başlangıçta farklı eleman türlerine özgü bir modele sahip olan bir JavaScript dizisine, sonra da sondaki tekrarlanan öğe türüne (türlerine) rastgele bir tekrar sayısına sahip olacağım.TypeScript: Farklı öğe türlerine sahip, ancak sabit uzunlukta olmayan bir JavaScript dizisi için nasıl bir tür bildirebilirim?

Bu JavaScript dizisiyle uyumlu olacak bir TypeScript türünü nasıl bildirebilirim?

interface A { 
    foo: Foo, 
    bar: Bar, 
} 

interface B { 
    baz: Baz 
} 

interface Bat { 
    // getArr(): [A, B, B, B], // tuple type puts types at specific indexes 
           // but only supports a fixed number of elements 
    // getArr(): Array<A | B>, // array type notation allows arbitrary number 
           // of elements but doesn't require them to be 
           // in specific positions 
} 

Düzenleme:

Ben mevcut JavaScript kodu sorunları tanımlamak için vanilya JavaScript kodu ile dış typescript bildirimleri kullanılarak deneme am, ayrıca netleştirmek için. Temsilin yanlış olabileceğini anlıyorum; Orijinal Javascript kodunun oluşturulmasında daha fazla bilgelik kullanılmış olsaydı, bu maceranın üzerine çıkmazdım.

cevap

2

typescript tip sistemine yönelik bu tür bildirmek için mümkün değildir: diziler dizisi (Array<c'>) homojen c', c' = A | B ait Bu durumda, bir homojen tip

olması gerekir. veri yapısı ayrıştırılabilir eğer


Tabii ki, daha sonra bir ek/kompleks kodlama, örneğin, "uygun" olabilir.

[ A, Array<B> ] 

Böyle bir kısıtlama verir herhangi bir programlama dili tipi sisteminin farkında değilim - bir ilişkisiz sekans için - keyfi desen kurallara dayalı.

+2

Ayrıca diziler, listeler ve benzerleri de bu değil. Farklı türden elemanlar varsa, muhtemelen farklı koleksiyonlara isim veren bir nesne kullanmalısınız. – Pablo

+0

TypeScript, dizilerde homojen olmayan türler için bazı desteklere sahiptir: https://github.com/Microsoft/TypeScript/blob/master/doc/spec.md#333-tuple-types – rakslice

+1

@rakslice Tuplelerin homojen olması gerekmez. Ama sonra tuples diziler değildir. – user2864740

İlgili konular