2017-04-21 25 views
5

Bir dizinin iç türünü 'ayıklayan' türünde bir tür bildirmenin bir yolu var mı?Yazı tipindeki bir diziden nasıl bir tip ayırım?

Örnek:

en Zaten benim kod temeli böyle bir şey var diyelim:

type InnerCacheType = Event | User; 

Fakat olmadan:

export interface Cache { 
    events: Event[], 
    users: User[] 
} 
type CacheType = Event[] | User[]; 

//or maybe: 
// type TypeOfProperty = T[keyof T]; 
// type CacheType = TypeOfProperty<Cache>; 

İstediğim bu eşdeğer olacaktır şeydir Cache veya CacheType

için bir şey eklediğimde her zaman elle yeniden yazma

Bu, Typescript'te mümkün mü?

cevap

2

İsterseniz, TypeScript 2.1 veya üstü kullanabileceğinizi varsayalım, aksi halde aradığınız şeyi elde etmenin bir yolu yoktur.

Ayrıca, Cache arabiriminin tüm özelliklerinin diziler olacağını kabul ettiğinizi unutmayın. Eğer durum böyle değilse, sorunuz anlamsızlaşır, bu yüzden bu varsayımı yapacağım.

Genel olarak konuşursak, CacheType herhangi kalıtsal özellikleri dahil

type CacheType = Cache[typeof Cache]; 

olarak yazılabilir. Elde edilen tip Event[] | User[]'a eşdeğerdir, ancak dizi bileşenlerinin bu tür birleşim türünden çıkarılması mümkün değildir.

Çözüm, eşlenen türleri kullanıyor. InnerCacheType Eğer

type MappedCacheType = { [P in keyof Cache]: Cache[P][0]; }; 

Aslında, geçen tipin typescript aynı isimleri tutar fark Lütfen

{ events: Event; users: User; } 

eşdeğerdir

type InnerCacheType = MappedCacheType[typeof MappedCacheType]; 

olarak yazılabilir aradığınız orijinal olanları.

Özetle, kullanım durumunuzu dikkate almadan, T dizi türünün bileşen türünü ifade etme yolu T[0]'dur.