2017-04-21 6 views
5

क्या टाइपस्क्रिप्ट में एक प्रकार घोषित करने का कोई तरीका है जो किसी भी प्रकार के सरणी को 'निष्कर्ष' देता है?मैं टाइपस्क्रिप्ट में किसी सरणी से एक प्रकार कैसे निकालूं?

उदाहरण:

चलो कहते हैं कि मैं पहले से ही मेरे codebase में कुछ इस तरह है:

type InnerCacheType = Event | User; 

लेकिन बिना:

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

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

क्या मैं चाहता हूँ कुछ है जो इस के बराबर होगा है जब भी मैं Cache या CacheType

01 पर कुछ जोड़ता हूं तो मैन्युअल रूप से इसे फिर से टाइप करना

क्या यह टाइपस्क्रिप्ट में संभव है?

उत्तर

2

मान लीजिए कि आप टाइपस्क्रिप्ट 2.1 या इससे अधिक का उपयोग कर सकते हैं, अन्यथा जो भी आप ढूंढ रहे हैं उसे हासिल करने का कोई तरीका नहीं है।

इसके अलावा, ध्यान रखें कि आप Cache इंटरफेस के सभी गुण सरणी होंगे। यदि यह मामला नहीं है, तो आपका प्रश्न बेवकूफ हो जाता है, इसलिए मैं यह धारणा भी करूंगा।

सामान्य शब्दों में, CacheType रूप

type CacheType = Cache[typeof Cache]; 
किसी भी विरासत में मिला गुण सहित

लिखा जा सकता है। प्राप्त प्रकार Event[] | User[] के बराबर है, हालांकि इस तरह के यूनियन प्रकार से सरणी घटकों को निकालना असंभव है।

समाधान मैप किए गए प्रकारों का उपयोग कर रहा है। InnerCacheType आप के रूप में

type InnerCacheType = MappedCacheType[typeof MappedCacheType]; 

जहां

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

वास्तव में, पिछले प्रकार

{ events: Event; users: User; } 

के बराबर है कृपया ध्यान दें टाइपप्रति नाम ही रहता लिखा जा सकता है के लिए देख रहे हैं मूल के रूप में।

संक्षेप में, आपके उपयोग के मामले पर विचार किए बिना, सरणी प्रकार T के घटक प्रकार को व्यक्त करने का तरीका T[0] है।

संबंधित मुद्दे