2016-08-25 3 views
15

मैं फ़्लो का उपयोग करने के लिए मौजूदा कोडबेस माइग्रेट करने का प्रयास कर रहा हूं। चूंकि इस परियोजना के प्रवाह के बिना शुरू हुआ, मैं enums और इस तरह के लिए एक सुंदर ठेठ जेएस पैटर्न का उपयोग कर रहा हूँ।प्रवाह प्रकार की जांच के साथ Enums का उपयोग/परिभाषित कैसे करें?

यहाँ कुछ परिभाषाओं मैं

export const LOAN_STATUS = { 
    PENDING: 'pending', 
    CURRENT: 'current', 
    DUE: 'due', 
    OVERDUE: 'overdue', 
    PENDING_PAYMENT: 'pending_payment', 
    CHARGED_OFF: 'charged_off', 
    VOIDED: 'voided', 
    DISPUTED: 'disputed', 
    REFUNDED: 'refunded', 
    SETTLED: 'settled', 
} 

export const ACTIVE_LOAN_STATUS = [ 
    LOAN_STATUS.OVERDUE, 
    LOAN_STATUS.CURRENT, 
    LOAN_STATUS.DUE, 
    LOAN_STATUS.PENDING_PAYMENT, 
] 

जब तक मैं इस फ़ाइल को आयात प्रवाह ठीक काम करता है करना चाहते हैं और यह मैं प्रकार एनोटेशन जोड़ने की जरूरत है कहते हैं। यह अजीब लगता है - मुझे उन वस्तुओं को एनोटेट करना क्यों चाहिए जो पूरी तरह स्थैतिक और आसानी से अनुमानित हैं?

क्या कोई तरीका है जो इसके प्रकार को "स्थैतिक" या "शाब्दिक" के रूप में परिभाषित करता है?

तो मैं सोच रहा हूं कि मैं इस पर एनोटेशन जोड़ने जा रहा हूं। मेरा पहला विचार सिर्फ {[key: string]: string} और Array<string> है। प्रवाह काम करता है, लेकिन मुझे लगता है कि इन प्रकार की परिभाषा पूरी तरह से बेकार है। तो फिर मैं इस दूसरे तरीके का प्रयास करें:

type LoanStatusValues = 
    'pending' | 
    'current' | 
    'due' | 
    'overdue' | 
    'pending_payment' | 
    'charged_off' | 
    'voided' | 
    'disputed' | 
    'refunded' | 
    'settled' 

type LoanStatusKeys = 
    'PENDING' | 
    'CURRENT' | 
    'DUE' | 
    'OVERDUE' | 
    'PENDING_PAYMENT' | 
    'CHARGED_OFF' | 
    'VOIDED' | 
    'DISPUTED' | 
    'REFUNDED' | 
    'SETTLED' 

type ActiveLoanStatus = 
"current" | 
"due" | 
"overdue" | 
"pending_payment" 

और मैं प्रकार एनोटेशन {[key: LoanStatusKeys]: LoanStatusValues} और Array<ActiveLoanStatus> का उपयोग करें। लेकिन इन टिप्पणियों को भी इस तथ्य को ढीला कर दिया कि यह स्थिर है!

यह इतना अजीब लगता है कि मुझे यह बहुत डुप्लिकेट कोड लिखना है। और फिर यदि मैं केवल फ्लो में कनवर्ट करना चाहता हूं तो मैं वास्तव में जेएस में प्रकारों का उपयोग नहीं कर सकता। उदाहरण के लिए मैं यह कर सकता है:

type ActiveLoanStatus = 
    "current" | 
    "due" | 
    "overdue" | 
    "pending_payment" 

if (loan.status isTypeOf ActiveLoanStatus) { 

} 

तो मैं इन स्थिर enums का उपयोग करना चाहिए:

if (defs.ACTIVE_LOAN_STATUS.indexOf(loan.status) !== -1) { 

} 

अब अगर मैं प्रवाह प्रकार उपयोग करना चाहते हैं, मैं इस तरह कुछ नहीं कर सकते? मुझे यह गलत करना होगा!

+0

प्रासंगिक गिथब मुद्दा: https: // github।कॉम/फेसबुक/प्रवाह/मुद्दे/627 – aug

उत्तर

12

यहां सबसे संक्षिप्त तरीके से इस लक्ष्य को हासिल करने के लिए है:

const activeLoanStatuses = { 
    current: 'current', 
    due: 'due', 
    overdue: 'overdue', 
    pending_payment: 'pending_payment' 
}; 

const otherLoanStatuses = { 
    pending: 'pending', 
    charged_off: 'charged_off', 
    voided: 'voided', 
    disputed: 'disputed', 
    refunded: 'refunded', 
    settled: 'settled', 
}; 

type ActiveLoanStatus = $Keys<typeof activeLoanStatuses>; 
type LoanStatus = $Keys<typeof otherLoanStatuses> | ActiveLoanStatus; 

const activeLoanStatusesMap: { [key: LoanStatus]: ?ActiveLoanStatus} = activeLoanStatuses; 

if (activeLoanStatusesMap[loan.status]) { 

} 
+2

हम्म। और यदि चाबियाँ मानों के बराबर नहीं हैं ...? – Chet

+1

दुर्भाग्यवश, आपको इस मामले में डुप्लिकेट करना होगा – vkurchatkin

1

जबकि अविश्वसनीय रूप से अत्यधिक शब्द, और गैर स्केलेबल, इस प्रवाह की 'Disjoint Unions "मामले में गिर जाता है और इस तरह के === का उपयोग कर कार्यान्वित किया जा सकता। जैसा कि उन्होंने उस पृष्ठ पर उल्लेख किया है, केस ऑपरेशन उस ऑपरेटर के माध्यम से किया जाता है, क्योंकि जावास्क्रिप्ट स्वाभाविक रूप से switch-case कथन के साथ करता है।

switch(loan.status) { 
    'pending': 
    'current': 
    'due': 
    'overdue': 
    'pending_payment': 
    'charged_off': 
    'voided': 
    'disputed': 
    'refunded': 
    'settled': 
    // your behavior here 
} 

मैं उल्लेख किया है, इस कोड को जो अपने प्रकार का उपयोग करता है में अत्यधिक वर्बोज़ है, लेकिन यह मुकाबला करने के लिए, यह एक बनाने के बिना अपने प्रकार को परिभाषित करने को लाभ मिलता है:

आपके मामले में, कि के बराबर बॉयलरप्लेट ऑब्जेक्ट- आप बस अपने शाब्दिक विकल्पों को परिभाषित करते हैं और उन्हें एक साथ जोड़ते हैं (आपका दूसरा कार्यान्वयन)।

यह आपके उपभोक्ताओं के कार्यान्वयन के साथ आपकी टाइप परिभाषा को जोड़ने का स्पष्ट नकारात्मक पक्ष है, इसलिए सावधानी के साथ उपयोग करें।

0

प्रवाह के साथ एक enum व्यक्त करने के लिए आप जमे हुए ऑब्जेक्ट प्रकार के साथ संयोजन के रूप में $Values उपयोगिता का उपयोग कर सकते हैं:

export const LOAN_STATUS = Object.freeze({ 
    PENDING: 'pending', 
    CURRENT: 'current', 
    DUE: 'due', 
    OVERDUE: 'overdue', 
    PENDING_PAYMENT: 'pending_payment', 
    CHARGED_OFF: 'charged_off', 
    VOIDED: 'voided', 
    DISPUTED: 'disputed', 
    REFUNDED: 'refunded', 
    SETTLED: 'settled', 
}); 

type LoanStatus = $Values<typeof LOAN_STATUS>; 

export const ACTIVE_LOAN_STATUS: LoanStatus[] = [ 
    LOAN_STATUS.OVERDUE, 
    LOAN_STATUS.CURRENT, 
    LOAN_STATUS.DUE, 
    LOAN_STATUS.PENDING_PAYMENT, 
] 

यह 0.60.0 संस्करण से शुरू काम करता है।

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