2017-02-13 16 views
11

मैं निम्नलिखित निरंतर स्ट्रिंग है कहते हैं:प्रवाह प्रकार, और निर्भर प्रकार

export default const FOO = 'FOO'

कहो मैं बहुत की तरह एक प्रवाह एनोटेट फ़ाइल में इस आयात:

import FOO from '../consts/Foo'

मेरे पास एक समारोह है:

const example = (foo : string) : {| type: FOO, foo: string |} => { 
    return {type: FOO, foo: foo} 
} 

इस के साथ typecheck नहीं करता है:

6: const example = (foo : string) : {| type: FOO, foo: string |}=> { 
                 ^^^^^^^^^^^^^^ string. Ineligible value used in/as type annotation (did you forget 'typeof'?) 
    6: const example = (foo : string) : {| type: FOO, foo: string |}=> { 
                 ^^^^^^^^^^^^^^ FOO 

तो मेरी प्रश्न हैं:

1) यह, प्रवाह प्रकार में स्थिरांक उपयोग करना संभव है मैं इस व्यवहार को कैसे पुन: पेश कर सकते हैं?

2) क्या प्रवाह में निर्भर प्रकार करना संभव है? तो उदाहरण के लिए, क्या मैं प्रकारों के माध्यम से एन्कोड कर सकता हूं, कि लौटाई गई स्ट्रिंग एक ही स्ट्रिंग होनी चाहिए जो example फ़ंक्शन में पारित हो?

संपादित करें: भाग 2 के लिए स्पष्टीकरण: यह संकेत मिलता है कि foo पैरामीटर example समारोह में पारित कर दिया वास्तव में वापसी वस्तु में foo कुंजी पर स्ट्रिंग के रूप में एक ही स्ट्रिंग है किसी तरह से करना संभव है? या यह कहने के लिए कि इनपुट और आउटपुट में एक ही लंबाई है (एक शिफ्ट सिफर फ़ंक्शन कहने के लिए)। या कहें कि एक ही वर्ण का क्रमपरिवर्तन शामिल है? (एक शफल के लिए)।

https://en.wikipedia.org/wiki/Dependent_type

+0

यदि आप 'FOO'' टाइप करना चाहते हैं तो 'FOO'' तो आपको इसे घोषित करने की आवश्यकता होगी, अन्यथा यह केवल एक स्ट्रिंग है। ऑब्जेक्ट्स के लिए, आप फिर टाइप करेंगे जैसे टाइप टाइप: टाइपफ फूड '। मुझे पूरा यकीन नहीं है कि आप अपने 2 में क्या पूछ रहे हैं) हालांकि। फिर आप उसी स्ट्रिंग मान वाले दो गुणों वाले ऑब्जेक्ट के साथ समाप्त हो जाएंगे। – loganfsmyth

उत्तर

5

बजाय एक const रूप FOO घोषित करने के लिए, एक संबंध तोड़ना संघ के रूप में यह घोषणा सिर्फ एक शाखा के साथ:

type FOO = "FOO" 

फिर अपने कोड इस तरह अपडेट किया जा सकता है:

const example = (foo : string) : {| type: FOO, foo: string |} => { 
    return {type: "FOO", foo: foo} 
} 

यदि आप सटीक स्ट्रिंग शाब्दिक "FOO" के अलावा किसी भी मान का उपयोग करते हैं जहां FOO है आवश्यक है, तो यह एक संकलन त्रुटि है।

यदि आप अपना निरंतर रखना चाहते हैं, तो आपको अलग-अलग प्रकार का नाम देना होगा, क्योंकि वे टकराएंगे। तो अगर आप कर सकता है:

const FOO = "FOO" 
type FooType = "FOO"; 

const example = (foo : string) : {| type: FooType, foo: string |} => { 
    return {type: FOO, foo: foo} 
} 

दुर्भाग्य से, मैं एक तरह से स्ट्रिंग शाब्दिक डुप्लिकेट करने से बचने के लिए, नहीं देख सकते क्योंकि प्रकार संबंध तोड़ना संघ परिभाषा वाक्य रचना केवल शाब्दिक और प्रकार, नहीं चर भले ही वे स्थिरांक हैं अनुमति देता है।

+0

कोड के कुछ उद्धरणों को साफ़ करने के लिए तारों के रूप में कार्य प्रकारों को परिभाषित करने के प्रवाह मानक मानक पैटर्न के लिए यह एक बहुत ही रोचक पैटर्न है। इस तरह, और अगर मैं गलत हूं, तो मुझे सही करें, मैं मेटा प्रकार को परिभाषित कर सकता हूं 'ValidResponses = FOO | बार; 'और सुनिश्चित करें कि एपीआई फ़ंक्शन कॉल एक सही प्रकार का डेटा न केवल सही प्रतिक्रिया देता है। – ermik

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