2016-12-17 17 views
11

में यूनियन प्रकारों की सरणी के लिए ऑब्जेक्ट्स की सरणी असाइन नहीं कर सकता है, मैं फ्लो सीख रहा हूं और इसलिए मैं जावास्क्रिप्ट और फ्लो के साथ एक छोटी शौक परियोजना पर काम कर रहा हूं। मेरे पास Foo और एक अलग वर्ग Bar है जो मैं Foo ऑब्जेक्ट्स को कन्स्ट्रक्टर में एक विकल्प के रूप में लेना चाहता हूं। हालांकि, मैं भी इस तरह के प्रत्येक ऑब्जेक्ट के लिए कुछ अन्य डेटा भेजने में सक्षम होना चाहता हूं, और इसलिए मैं एक सरणी रखना चाहता हूं जहां प्रत्येक तत्व या तो एक सादा Foo ऑब्जेक्ट है, या Foo ऑब्जेक्ट या एब्जेक्ट में लिपटे ऑब्जेक्ट है।फ़्लो

हालांकि, जब मैंने इसके लिए कोड लिखने की कोशिश की, तो मुझे कुछ अजीब त्रुटियां मिलीं जिन्हें मैं समझ नहीं पा रहा हूं। जहां तक ​​मैं कह सकता हूं, ऐसा लगता है कि एक प्रकार का संघर्ष है क्योंकि Foo संघ के प्रकारों के सभी के साथ संगत नहीं है, लेकिन जहां तक ​​मैं समझता हूं कि इसे केवल उनमें से कम से कम एक के साथ संगत होना चाहिए

// @flow 

class Foo { } 

interface BarOptions { 
    foos: (Foo | [ Foo ] | { foo: Foo })[];   // line 6 
} 

class Bar { 
    constructor(options?: BarOptions) { } 
} 

const foo: Foo = new Foo(); 

const bar = new Bar({ 
    foos: [ foo ],         // line 16 
}); 

मैं निम्नलिखित त्रुटियाँ मिलती है::

Line 6: 
    tuple type: This type is incompatible with Foo 
    object type: This type is incompatible with Foo 
Line 16: 
    tuple type: This type is incompatible with Foo 
    object type: This type is incompatible with Foo 

है वहाँ ...

यहाँ कम से कम कोड मैं सही त्रुटियों मुझे मिल पुन: पेश करने की जरूरत है (link to tryflow.org example) है इन त्रुटियों के लिए एक सहज (या अनजान) कारण?

उत्तर

2

मुझे लगता है कि BarOptions वास्तव में एक इंटरफेस के बजाय एक प्रकार उपनाम होना चाहिए। एक इंटरफ़ेस declares a type that classes can implement। इंटरफेस डेटा प्रकार नहीं हैं और उनके पास फ़ील्ड नहीं होना चाहिए (डेटा युक्त)।

यहां सब कुछ काम करता है अगर हम interface BarOptions को type BarOptions = में बदलते हैं।

वैकल्पिक रूप से आप foo बदलने एक गेटर समारोह बनने के लिए कर सकते हैं:

interface BarOptions { 
    foos(): (Foo | [ Foo ] | { foo: Foo })[]; 
} 
2

क्या आपको लगता है यह इस खुले Github ticket से संबंधित हो सकता है? अगर हम type साथ interface की जगह है, यह सत्यापित करता है:

// @flow 

class Foo { } 

type BarOptions ={ 
    foos: 
     Class<Foo> | 
     Foo | 
     Foo[] | 
     { foo: Foo } 
} 

class Bar { 
    constructor(options?: BarOptions) { } 
} 

const foo: Foo = new Foo(); 

const bar = new Bar({ 
    foos: Foo, 
// foos: foo, 
// foos: [foo], 
// foos: { foo: foo }, 
}); 
+0

आप इस काम करेगा व्याख्या कर सकते हैं? (मेरा सवाल यह नहीं है कि इसे कैसे ठीक किया जाए, यह समझने की कोशिश कर रहा है कि यह पहली जगह क्यों है) – Frxstrem

+0

मैं यह देखने में असफल रहा कि दोनों अलग कैसे हैं; जैसा कि मैंने इसे समझा है, दोनों मामलों में 'foo' को उसी प्रकार (' Foo') के साथ घोषित किया जाएगा, केवल अंतर यह है कि आपकी पहली पंक्ति में प्रकार स्पष्ट है जबकि दूसरे में यह स्पष्ट है। जब तक मुझे बहुत गलत समझा जाता है कि प्रवाह प्रकार कैसे काम करते हैं, मैं नहीं देखता कि यह अलग तरीके से कैसे व्यवहार करेगा (हालांकि ऐसा लगता है कि वे ऐसा करते हैं)। – Frxstrem

+0

क्या यह समस्या इस से संबंधित हो सकती है? https://github.com/facebook/flow/issues/1569 –

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