2017-06-23 10 views
5

मुझे टाइपस्क्रिप्ट और रेडक्स-थंक क्रियाओं के साथ कुछ असुविधाएं हैं।रेडक्स के साथ टाइपस्क्रिप्ट, क्रिया परिभाषा को फिर से घोषित किए बिना कनेक्ट का उपयोग कैसे करें?

असल में मेरे घटक प्रतिक्रिया निर्माताओं को बांधने के लिए प्रतिक्रिया-रेडक्स कनेक्ट का भारी उपयोग करते हैं, समस्या यह है कि जब मैं घटक के भीतर इस रेडक्स क्रियाओं के लिए इंटरफ़ेस बनाता हूं, तो मुझे फ़ंक्शन परिभाषा को फिर से घोषित करना पड़ता है क्योंकि यह खो जाता है कनेक्ट कॉल पर।

यहां एक नमूना कोड है:

कार्रवाई प्रजापति

import api from './api'; 
import { Dispatch } from 'redux'; 
import { IReduxAction } from 'model'; 

export const FETCH_ENTITY = 'location/FETCH_ENTITY'; 
export function fetchEntity(id: string) { 
    return (dispatch: Dispatch<IReduxAction>) => { 
    dispatch({type: `${FETCH_ENTITY}_REQUEST`, payload: {id}}); 

    return api.fetchEntity(id) 
       .then((res) => { 

       dispatch({ type: `${FETCH_ENTITY}_DONE`, payload: res }); 
       return res; 
       }) 
       .catch((err) => { 
       dispatch({type: `${FETCH_ENTITY}_FAIL`, payload: err, error: true}); 
       throw err; 
       }); 
    }; 
} 

घटक

import * as React from 'react'; 
import { bindActionCreators } from 'redux'; 
import { connect } from 'react-redux'; 

import { 
    fetchEntity, 
} from 'actions'; 

interface IStateProps { 
    startingEntities: any[]; 
} 

interface IDispatchProps { 
    fetchEntity: (id: string) => Promise<any>; // <- this is what I'm trying to get rid of, basically whenever I change the action creator I have to change this definition everytime 
} 

class Dashboard extends React.Component<IStateProps & IDispatchProps, void> { 

    public render() { 

    return (<div>...RENDER SOMETHING...</div>); 
    } 

} 

const mapStateToProps = (state: any, ownProps: any) => { 
    const startingEntities = foo(); // not important 

    return { 
    startingEntities, 
    }; 
}; 

const mapDispatchToProps = (dispatch: any) => { 
    return bindActionCreators({ 
    fetchEntity 
    }, dispatch); 
}; 

export default connect<IStateProps, IDispatchProps, void>(mapStateToProps, mapDispatchToProps)(Dashboard); 

यह हर फिर से घोषित करने के लिए प्रत्येक पर बिना इस आबद्ध कार्रवाई निर्माता घोषित करने के लिए वहाँ वैसे भी है फाइल?

उत्तर

6

आप समारोह प्रकार फिर से परिभाषित करने की जरूरत नहीं है का उपयोग कर सकते हैं। टिप्पणी के लिए

interface IDispatchProps { 
    fetchEntity: typeof fetchEntity 
} 
0

मुझे उस डिज़ाइन पैटर्न को समझने के लिए निश्चित नहीं है जिसे आप ढूंढ रहे हैं लेकिन एक्शन क्रिएटर केवल एक साधारण वस्तु है जिसका उपयोग करने वाले रेड्यूसर के लिए आवश्यक 'प्रकार' है।

इसलिए मुझे लगता है कि इसे संभालने का सबसे अच्छा तरीका है कि आप अपने कार्यों के साथ समर्पित फ़ाइल प्राप्त करें और फिर उन्हें आयात करें। प्रेषण के लिए कार्रवाई के चयन के बारे में आपका तर्क आपके घटक व्यवहार में होगा जो मुझे बेहतर लगता है।

मुझे आशा है कि इस मदद और अपने मुद्दे :)

+0

धन्यवाद लेकिन यह है कि मेरी समस्या के रूप में आप अपने कार्यों को एक अलग फाइल में पहले से ही देख सकते हैं नहीं है (आयात { fetchEntity, } 'क्रियाओं' से;), मैं: आप typeof उपयोग कर सकते हैं मैं अपने कार्यों के लिए प्रकार परिभाषाओं से निपटने की कोशिश कर रहा हूं, अधिक विशेष रूप से, जब भी मैं किसी घटक में 'कनेक्ट' का उपयोग करता हूं, तो टाइप परिभाषा को फिर से घोषित करता हूं। – ospfranco

+0

ठीक है, टाइपस्क्रिप्ट के बारे में मेरी समझ मुझे और मदद करने के लिए रोकती है :(क्षमा करें –

1

मैं टाइपप्रति (ज्यादातर सिर्फ पुस्तकालय इंटरफेस के लिए index.d.ts फ़ाइलों किया है) से परिचित नहीं हूँ का समाधान होगा, लेकिन तुम क्या करने प्रकार प्रणाली प्राप्त करने के लिए सक्षम होना चाहिए fetchEntity सही ढंग से टाइप करके और IDispatchProps के लिए इसका उपयोग करने के लिए इसे सही ढंग से टाइप करके आपके लिए काम करें।

//... 

import { ThunkAction } from 'redux-thunk' 

//... 

export interface FetchEntity { 
    (id: string): ThunkAction<Promise<any>, IReduxAction, any>; 
} 

//... 

export const fetchEntity: FetchEntity = (id: string) => { 
    return (dispatch: Dispatch<IReduxAction>) => { 
    //... 
    }; 
} 

की तरह कुछ और फिर आप इसे आयात और एक ही परिभाषा

//... 

import { 
    fetchEntity, 
    FetchEntity 
} from 'actions'; 

//... 

interface IDispatchProps { 
    fetchEntity: FetchEntity 
} 

//... 
+0

मुझे ठीक काम करना प्रतीत होता था, लेकिन जब मैंने कोड को संकलित करने का प्रयास किया, तो यह महसूस किया कि प्रकार एक वादा नहीं है, मेरे कोड में मैं कॉल का उपयोग कर रहा हूं। कुछ अन्य यूआई क्रिया करने के लिए समाप्त हो गया है, शायद मैं एक विरोधी पैटर्न का उपयोग कर रहा हूं? – ospfranco

+0

@ospfranco, मुझे लगता है कि निंटन का बेहतर समाधान है। –

+0

निंटन प्रतिक्रिया भी एक ही समस्या का सामना करती है, थंक परिभाषा एक वादा नहीं है, मैं उस प्रकार पर कॉल नहीं कर सकता – ospfranco

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