2017-06-07 5 views
7

से अधिक विशिष्ट है, मैं एक सरणी के लिए एक प्रकार को परिभाषित करना चाहता हूं जिसका पहला तत्व एक विशिष्ट प्रकार (जैसे फ़ंक्शन) है, और शेष तत्व हैं खाली प्रकार उदाहरण के लिए:टाइपस्क्रिप्ट में, किसी सरणी के लिए एक प्रकार को परिभाषित करें जहां पहला तत्व शेष

type FAs = [Function, {}, {}, {}, ...]; // pseudo code 

ऐसी चीज संभव है?

उद्देश्य इस तरह एक एकल तर्क समारोह प्रदान करना है:

const myCaller = (fun: Function, args: any[]) => fun.apply(args); 

लेकिन सौंदर्य कारणों के लिए:

const myCaller = ([fun, ...args]: FAs) => fun.apply(args); 

एक वैकल्पिक दृष्टिकोण इस तरह, myCaller को दो तर्क का उपयोग किया जाएगा मैं एक भी तर्क का उपयोग करना पसंद करूंगा। मुझे यह भी आश्चर्य होता है कि टाइप सिस्टम का समर्थन करता है कि तर्कसंगत रूप से एक मनमाना-लंबाई ट्यूपल क्या है। शायद ऐसी चीज कंप्यूटर विज्ञान के कारणों के लिए अवांछनीय है जो मुझे समझ में नहीं आती है।

+0

कुछ हद तक प्रासंगिक: https://github.com/Microsoft/TypeScript/issues/212 –

उत्तर

6

आप

type FAs = [Function, {}]; 

निर्धारित करते हैं तो फिर प्रकार FAs के मूल्यों प्रकार Function के पहले तत्व, प्रकार {} का एक दूसरा तत्व है, और Function | {} के सफल होने के तत्वों की आवश्यकता होगी। इस प्रकार टाइपस्क्रिप्ट शाब्दिक सरणी प्रकार काम करते हैं। से TS docs:

जब जाना जाता सूचकांकों के सेट के बाहर एक तत्व तक पहुँचने, एक संघ प्रकार के बजाय प्रयोग किया जाता है:

इस तथ्य यह है कि आप हो जाएगा के लिए के अलावा सब कुछ आप चाहते हैं करना चाहिए Function-सरणी मान को सरणी के तीसरे तत्व आदि के रूप में पास करने में सक्षम। लेकिन असल में यह मामला होगा, क्योंकि Function{} के साथ संगत है।

इसके आसपास कोई रास्ता नहीं है। टीएस में कोई सरणी प्रकार परिभाषित करने का कोई तरीका नहीं है जहां पहले n तत्व कुछ विशिष्ट प्रकार के होते हैं, और कुछ अन्य विशिष्ट प्रकार के शेष तत्वों की मनमानी संख्या होती है।

मुझे यह भी आश्चर्य है कि टाइप सिस्टम तर्कसंगत रूप से एक मनमाना-लंबाई ट्यूपल का समर्थन करता है या नहीं।

वास्तव में, प्रकार प्रणाली केवल मनमाना-लंबाई tuples का समर्थन करता है। अगर आप कहते हैं

type Tuple = [number, number]; 

इस प्रकार लंबाई दो या अधिक से अधिक, कि संख्या शामिल की, किसी भी सरणी के साथ संगत है।अगर आप कहते हैं

type Tuple = [string, number]; 

इस प्रकार, किसी भी सरणी के साथ संगत है लंबाई की दो या उससे अधिक समय अपनी पहली तत्व के रूप में एक स्ट्रिंग, अपनी दूसरी के रूप में एक नंबर, और या तो एक स्ट्रिंग या अपने तीसरे के रूप में संख्या है आदि। मैं इस व्यवहार के कारणों को "कंप्यूटर-विज्ञान आधारित" नहीं कहूंगा; टीएस के लिए यह जांचना संभव है कि यह जांचना संभव है।

एक वैकल्पिक दृष्टिकोण

interface Arglist { 
    [index: number]: object; 
    0: Function; 
} 

const a1: Arglist = [func]; 
const a2: Arglist = [22];     // fails 
const a3: Arglist = [func, "foo"];   // fails 
const a4: Arglist = [func, obj]; 
const a5: Arglist = [func, obj, obj]; 
+0

मुझे नहीं पता था कि प्रलेखन पृष्ठ कई बार पढ़ने के बावजूद टाइपस्क्रिप्ट ज्ञात सूचकांक के सेट के बाहर तत्वों के लिए यूनियन प्रकार का उपयोग करेगा। स्पष्ट स्पष्टीकरण और दस्तावेज़ीकरण के लिंक के लिए धन्यवाद। – anticrisis

0

मुझे यकीन है कि यह टाइपस्क्रिप्ट 2.3 के रूप में आप सबसे अच्छा कर सकते हैं। उदाहरण के लिए आप लॉनाश में इस तरह की टाइपिंग देख सकते हैं।

interface IMyCaller { 
    <R>([fn]: [() => R]): R; 
    <R,A>([fn, a]: [(a: A) => R, A]): R; 
    <R,A,B>([fn, a, b]: [(a: A, b: B) => R, A, B]): R; 
    <R,A,B,C>([fn, a, b, c]: [(a: A, b: B, c: C) => R, A, B, C]): R; 
    // keep adding these until you get tired 
} 

const myCaller: IMyCaller = ([fun, ...args]) => fun.apply(args); 
+0

यह मैं क्या सोचा था, यह भी है, लेकिन तत्वों के लिए संघ टाइपिंग की टाइपप्रति के उपयोग विशेष रूप से नहीं है परिभाषित बहुत उपयोगी है। एक महत्वपूर्ण चेतावनी के साथ, एक उत्कृष्ट विवरण के लिए स्वीकृत उत्तर देखें। – anticrisis

+0

आप सही हैं, अगर आपको सख्त टाइपिंग की आवश्यकता नहीं है तो यह सहायक हो सकता है। मुझे लगता है कि मुझे दूर ले जाया गया और आपके प्रश्न पर बहुत करीब ध्यान नहीं दिया :) – dbandstra

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

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