2016-03-01 18 views
7

एक स्थिति है जहाँ आप दो इंटरफेस है कि पर्याप्त समान है कि आप तर्क के एक ही हिस्से के माध्यम से उन्हें चलाना चाहते हैं संभाल करने के लिए उचित तरीका है क्या से निपटना:टाइपप्रति संघ प्रकार: इंटरफेस

interface DescriptionItem { 
    Description: string; 
    Code: string; 
} 
interface NamedItem { 
    Name: string; 
    Code: string; 
} 

function MyLogic(i: DescriptionItem | NamedItem) { 
    var desc = (<DescriptionItem>i).Description || (<NamedItem>i).Name; 

    return i.Code + ' - ' + desc; 
} 

यह काम करता है; हालांकि, मेरा प्रश्न var desc = ... लाइन में सुधार करने पर है। क्या मेरे पास सबसे अच्छा विकल्प है? या टाइपस्क्रिप्ट में इस स्थिति को संभालने का एक बेहतर तरीका है?

+0

मैं कहूंगा कि जिस तरह से आप यह किया ठीक लग रहा है। हालांकि सवाल स्वयं मुख्य रूप से राय आधारित है और मैं इसे उस आधार पर बंद करने के लिए वोट दूंगा। :) – toskv

उत्तर

5

टाइपस्क्रिप्ट interfaces केवल संकलन समय पर मौजूद है, इसलिए रन-टाइम पर इंटरफ़ेस प्रकारों के परीक्षण के लिए आप इतना कुछ नहीं कर सकते हैं। आपके प्रश्न में निर्दिष्ट कोड समझ में आता है और शायद आपका सबसे अच्छा विकल्प है।

हालांकि, अगर आप लचीलापन बदलने के लिए अपने interfacesclasses के लिए, आप टाइपप्रति के प्रकार गार्ड और अधिक सुरुचिपूर्ण प्रकार की जाँच करने के लिए उपयोग कर सकते हैं:

class DescriptionItem { 
    Description: string; 
    Code: string; 
} 
class NamedItem { 
    Name: string; 
    Code: string; 
} 

function MyLogic(i: DescriptionItem | NamedItem) { 
    let desc: string; 
    if (i instanceof DescriptionItem) { 
     desc = i.Description; 
    } else { 
     desc = i.Name; 
    } 

    return i.Code + ' - ' + desc; 
} 
+0

आप क्यों जांच नहीं सकते कि 'i.Name' मौजूद है या उस पर आधारित प्रकारों को अलग करता है? – jocull

+0

@jocull क्या होगा यदि ऑब्जेक्ट 'नामांकित इटैम' का उदाहरण था, लेकिन इसका 'नाम'' अपरिभाषित 'था? –

+0

यदि यह गैर-वैकल्पिक डेटा अनुपलब्ध है, तो क्या यह वास्तव में 'नामांकित इटैम' का उदाहरण है? – jocull

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