2015-11-20 7 views
6

संक्षेप में, क्या एक इंटरफ़ेस होना संभव है जो कुछ मूल गुणों की घोषणा करता है, लेकिन अतिरिक्त गुणों को प्रतिबंधित नहीं करता है?टाइपस्क्रिप्ट इंटरफ़ेस जो अन्य गुणों की अनुमति देता है

मैं Flux pattern है, जो एक सामान्य डिस्पैचर को परिभाषित करता है उपयोग कर रहा हूँ:

class Dispatcher<TPayload> { 
    dispatch(arg:TPayload):void { } 
} 

मैं तो अपने ही पेलोड प्रकार के साथ एक डिस्पैचर बनाने के लिए, इस तरह:

interface ActionPayload { 
    actionType: string 
} 

const dispatcher = new Dispatcher<ActionPayload>(); 
यह मेरा वर्तमान स्थिति है

अब मेरे पास कुछ एक्शन कोड है जो कुछ अतिरिक्त डेटा के साथ एक पेलोड भेजना चाहिए, लेकिन ActionPayload इंटरफ़ेस केवल actionType के लिए अनुमति देता है। दूसरे शब्दों में, इस कोड:

interface SomePayload extends ActionPayload { 
    someOtherData: any 
} 

class SomeActions { 
    doSomething():void { 
     dispatcher.dispatch({ 
      actionType: "hello", 
      someOtherData: {} 
     }) 
    } 
} 

एक संकलन त्रुटि क्योंकि someOtherDataActionPayload इंटरफ़ेस से मेल नहीं खाता देता है। मुद्दा यह है कि कई अलग-अलग "एक्शन" कक्षाएं उसी प्रेषक का पुन: उपयोग करेंगे, इसलिए यहां someOtherData है, जबकि यह anotherKindOfData हो सकता है, और इसी तरह। फिलहाल, मैं इसे समायोजित करने के लिए कर सकता हूं new Dispatcher<any>() का उपयोग करें क्योंकि विभिन्न कार्यों को प्रेषित किया जाएगा। सभी क्रियाएं आधार ActionPayload साझा करती हैं, हालांकि, मैं new Dispatcher<extends ActionPayload>() या कुछ प्रकार जैसे प्रकार को बाधित करने में सक्षम होने की उम्मीद कर रहा था। क्या ऐसा कुछ संभव है?

उत्तर

1

मुझे लगता है कि मुझे वह मिला जो मैं ढूंढ रहा था। मैं SomePayload के लिए भेजा वस्तु डाल सकता है, और टीएससी की पुष्टि करता है दोनों कलाकारों इंटरफेस और डिस्पैचर की TPayload साथ कि अपनी संगत:

dispatcher.dispatch(<SomePayload>{ 
     actionType: "hello", 
     someOtherData: {} 
    }) 

Example online.

17

आप ActionPayload किसी अन्य संपत्ति आप कर सकते हैं स्वीकार करने के लिए चाहते हैं एक इंडेक्सर जोड़ें:

interface ActionPayload { 
    actionType: string, 
    [x: string]: any 
} 

देखें https://github.com/Microsoft/TypeScript/wiki/Breaking-Changes#strict-object-literal-assignment-checking

+0

धन्यवाद, यह अच्छा जानकारी है। यह मेरे अति-सरलीकृत शीर्षक का बिल्कुल जवाब देता है ... यह पता चला है कि ऑब्जेक्ट शाब्दिक कास्टिंग करके मेरे प्रश्न के विवरण में विस्तारित '' का उपयोग करने का एक तरीका था। बेकार सवाल के लिए खेद है। क्या मुझे शीर्षक और सारांश को ठीक करने का प्रयास करना चाहिए, पूर्व "एक सब-इंटरफ़ेस को कैसे कार्यान्वित करें और किसी ऑब्जेक्ट के साथ एक सुपर-इंटरफ़ेस को संतुष्ट करें", या बस अपना उत्तर स्वीकार करें? – Aaron

+0

एक या दूसरा मेरे साथ ठीक है। शीर्षक को बदलना संभवतः प्रश्नों को प्रतिबिंबित करना बेहतर है। – Sebastien

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