рдкреНрд░реИрдХреНрдЯрд┐рдХрд▓ рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯред рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ + рд░рд┐рдбрдХреНрд╕

рдореИрдВ рдпрд╣ рдирд╣реАрдВ рд╕рдордЭрддрд╛ рдХрд┐ рдЖрдк рдЖрдо рддреМрд░ рдкрд░ рд╕рдЦреНрдд рдЯрд╛рдЗрдкрд┐рдВрдЧ рдХреЗ рдмрд┐рдирд╛ рдХреИрд╕реЗ рд░рд╣рддреЗ рд╣реИрдВред рдХреНрдпрд╛ рдХрд░ рд░рд╣реЗ рд╣реЛ рд╕рд╛рд░рд╛ рджрд┐рди рдбреЗрдмрд┐рдЯ?

рд╡рд░реНрддрдорд╛рди рдореЗрдВ, рдХрд┐рд╕реА рднреА рдЖрдзреБрдирд┐рдХ рдлреНрд░рдВрдЯ-рдПрдВрдб рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХрд╛ рд╡рд┐рдХрд╛рд╕ hello world рд╕реНрддрд░ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рд╣реИ, рдЬрд┐рд╕ рдкрд░ рдЯреАрдо рдХрд╛рдо рдХрд░ рд░рд╣реА рд╣реИ (рдЬрд┐рд╕рдореЗрдВ рд╕рдордп-рд╕рдордп рдкрд░ рдкрд░рд┐рд╡рд░реНрддрди рд╣реЛрддрд╛ рд╣реИ), рдХреЛрдб рдмреЗрд╕ рдХреА рдЧреБрдгрд╡рддреНрддрд╛ рдкрд░ рдЙрдЪреНрдЪ рдорд╛рдВрдЧ рдХрд░рддрд╛ рд╣реИред рдЙрдЪрд┐рдд рд╕реНрддрд░ рдкрд░ рдХреЛрдб рдХреА рдЧреБрдгрд╡рддреНрддрд╛ рдХреЗ рд╕реНрддрд░ рдХреЛ рдмрдирд╛рдП рд░рдЦрдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо #gostgroup рдлреНрд░рдВрдЯ - рдПрдВрдб рдЯреАрдо рдореЗрдВ рдЕрджреНрдпрддрд┐рдд рд░рд╣рддреЗ рд╣реИрдВ рдФрд░ рдЖрдзреБрдирд┐рдХ рддрдХрдиреАрдХреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╕реЗ рдбрд░рддреЗ рдирд╣реАрдВ рд╣реИрдВ рдЬреЛ рд╡рд┐рднрд┐рдиреНрди рдкреИрдорд╛рдиреЛрдВ рдХреА рдХрдВрдкрдирд┐рдпреЛрдВ рдХреА рдкрд░рд┐рдпреЛрдЬрдирд╛рдУрдВ рдореЗрдВ рдЕрдкрдирд╛ рд╡реНрдпрд╛рд╡рд╣рд╛рд░рд┐рдХ рд▓рд╛рдн рджрд┐рдЦрд╛рддреЗ рд╣реИрдВ ред


рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЗ рдЙрджрд╛рд╣рд░рдг рдкрд░ рд╕реНрдЯреЗрдЯрд┐рдХ рдЯрд╛рдЗрдкрд┐рдВрдЧ рдФрд░ рдЗрд╕рдХреЗ рд▓рд╛рднреЛрдВ рдХреА рд╡рд┐рднрд┐рдиреНрди рд▓реЗрдЦреЛрдВ рдореЗрдВ рдмрд╣реБрдд рдЪрд░реНрдЪрд╛ рдХреА рдЧрдИ рд╣реИ, рдФрд░ рдЗрд╕рд▓рд┐рдП рдЖрдЬ рд╣рдо рдЕрдзрд┐рдХ рд▓рд╛рдЧреВ рдХрд╛рд░реНрдпреЛрдВ рдкрд░ рдзреНрдпрд╛рди рдХреЗрдВрджреНрд░рд┐рдд рдХрд░реЗрдВрдЧреЗ, рдЬреЛ рдлреНрд░рдВрдЯ-рдПрдВрдб рдбреЗрд╡рд▓рдкрд░реНрд╕ рдХреЛ рд╣рдорд╛рд░реА рдЯреАрдо рдХреЗ рдкрд╕рдВрджреАрджрд╛ рд╕реНрдЯреИрдХ (рд░рд┐рдПрдХреНрдЯ + рд░реЗрдбрдХреНрд╕) рдХреЗ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд░реВрдк рдореЗрдВ рд╕рд╛рдордирд╛ рдХрд░рдирд╛ рдкрдбрд╝рддрд╛ рд╣реИред


"рдореБрдЭреЗ рд╕рдордЭ рдореЗрдВ рдирд╣реАрдВ рдЖрддрд╛ рд╣реИ рдХрд┐ рдЖрдк рдЖрдо рддреМрд░ рдкрд░ рдПрдХ рд╕рдЦреНрдд рдЯрд╛рдЗрдкрд┐рдВрдЧ рдХреЗ рдмрд┐рдирд╛ рдХреИрд╕реЗ рд░рд╣рддреЗ рд╣реИрдВред рдЖрдк рдХреНрдпрд╛ рдХрд░ рд░рд╣реЗ рд╣реИрдВ? рдЕрдВрдд рдХреЗ рджрд┐рдиреЛрдВ рдХреЗ рд▓рд┐рдП рдбреЗрдмрд┐рдЯ?" - рд▓реЗрдЦрдХ рдХреЛ рдореЗрд░реА рдЬрд╛рдирдХрд╛рд░реА рдирд╣реАрдВ рд╣реИред


"рдирд╣реАрдВ, рд╣рдо рдкреВрд░реЗ рджрд┐рди рдкреНрд░рдХрд╛рд░ рд▓рд┐рдЦрддреЗ рд╣реИрдВ" - рдореЗрд░реЗ рд╕рд╣рдпреЛрдЧреАред


рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдореЗрдВ рдХреЛрдб рд▓рд┐рдЦрддреЗ рд╕рдордп (рдкрд╛рда рдореЗрдВ рдмрд╛рдж рдореЗрдВ рд╡рд┐рд╖рдп рдвреЗрд░ рд╣реЛ рдЬрд╛рдПрдЧрд╛), рдХрдИ рд▓реЛрдЧ рд╢рд┐рдХрд╛рдпрдд рдХрд░рддреЗ рд╣реИрдВ рдХрд┐ рдЙрдиреНрд╣реЗрдВ рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ рд▓рд┐рдЦрдиреЗ рдореЗрдВ рдмрд╣реБрдд рд╕рдордп рд▓рдЧрд╛рдирд╛ рдкрдбрд╝рддрд╛ рд╣реИред рд╕рдорд╕реНрдпрд╛ рдХрд╛ рдЪрд┐рддреНрд░рдг рдХрд░рдиреЗ рд╡рд╛рд▓рд╛ рдПрдХ рдЕрдЪреНрдЫрд╛ рдЙрджрд╛рд╣рд░рдг рд╣реИ react-redux рд╕реЗ connect рдХрдиреЗрдХреНрдЯрд░ рдлрд╝рдВрдХреНрд╢рдиред рдЖрдЗрдП рдиреАрдЪреЗ рджрд┐рдП рдЧрдП рдХреЛрдб рдкрд░ рдПрдХ рдирдЬрд╝рд░ рдбрд╛рд▓реЗрдВ:


 type Props = { a: number, b: string; action1: (a: number) => void; action2: (b: string) => void; } class Component extends React.PureComponent<Props> { } connect( (state: RootStore) => ({ a: state.a, b: state.b, }), { action1, action2, }, )(Component); 

рдпрд╣рд╛рдБ рдХреНрдпрд╛ рд╕рдорд╕реНрдпрд╛ рд╣реИ? рд╕рдорд╕реНрдпрд╛ рдпрд╣ рд╣реИ рдХрд┐ рдХрдиреЗрдХреНрдЯрд░ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЗрдВрдЬреЗрдХреНрд╢рди рдХреА рдЧрдИ рдкреНрд░рддреНрдпреЗрдХ рдирдИ рд╕рдВрдкрддреНрддрд┐ рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ рдЗрд╕ рд╕рдВрдкрддреНрддрд┐ рдХреЗ рд╕рд╛рдорд╛рдиреНрдп рдкреНрд░рдХрд╛рд░ рдХреЗ рдШрдЯрдХ рдЧреБрдгреЛрдВ (рд░рд┐рдПрдХреНрд╢рди) рдХрд╛ рд╡рд░реНрдгрди рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред рдмрд╣реБрдд рджрд┐рд▓рдЪрд╕реНрдк рд╡реНрдпрд╡рд╕рд╛рдп рдирд╣реАрдВ рд╣реИ, рдЖрдк рдХрд╣рддреЗ рд╣реИрдВ, рдЖрдк рдЕрднреА рднреА рдХрдиреЗрдХреНрдЯрд░ рд╕реЗ рдЧреБрдгреЛрдВ рдХреЗ рдкреНрд░рдХрд╛рд░ рдХреЛ рдПрдХ рдкреНрд░рдХрд╛рд░ рдореЗрдВ рдЗрдХрдЯреНрдард╛ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рдЬреЛ рддрдм рдШрдЯрдХ рдХреЗ рд╕рд╛рдорд╛рдиреНрдп рдкреНрд░рдХрд╛рд░ рдХреЗ рдЧреБрдгреЛрдВ рдХреЛ рдПрдХ рдмрд╛рд░ "рдХрдиреЗрдХреНрдЯ" рдХрд░рддреЗ рд╣реИрдВред рдореЗрд░реЗ рдкрд╛рд╕ рдЖрдкрдХреЗ рд▓рд┐рдП рдЦреБрд╢рдЦрдмрд░реА рд╣реИред рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдЖрдкрдХреЛ рдЖрдЬ рдРрд╕рд╛ рдХрд░рдиреЗ рджреЗрддрд╛ рд╣реИ! рдХреНрдпрд╛ рдЖрдк рддреИрдпрд╛рд░ рд╣реИрдВ? рдЪрд▓реЛ рдЪрд▓рддреЗ рд╣реИрдВ!


рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреА рд╢рдХреНрддрд┐


рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдЕрднреА рднреА рдЦрдбрд╝рд╛ рдирд╣реАрдВ рд╣реИ рдФрд░ рд▓рдЧрд╛рддрд╛рд░ рд╡рд┐рдХрд╕рд┐рдд рд╣реЛ рд░рд╣рд╛ рд╣реИ (рдЬрд┐рд╕рдХреЗ рд▓рд┐рдП рдореИрдВ рдЗрд╕реЗ рдкреНрдпрд╛рд░ рдХрд░рддрд╛ рд╣реВрдВ)ред рд╕рдВрд╕реНрдХрд░рдг 2.8 рд╕реЗ рд╢реБрд░реВ рд╣реЛрдХрд░, рдЗрд╕рдореЗрдВ рдПрдХ рдмрд╣реБрдд рд╣реА рджрд┐рд▓рдЪрд╕реНрдк рдлрд╝рдВрдХреНрд╢рди (рд╕рд╢рд░реНрдд рдкреНрд░рдХрд╛рд░) рджрд┐рдЦрд╛рдИ рджрд┐рдпрд╛, рдЬреЛ рд╕рд╢рд░реНрдд рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐рдпреЛрдВ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреА рдореИрдкрд┐рдВрдЧ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рдореИрдВ рдпрд╣рд╛рдВ рд╡рд┐рд╡рд░рдгреЛрдВ рдореЗрдВ рдирд╣реАрдВ рдЬрд╛рдКрдВрдЧрд╛, рд▓реЗрдХрд┐рди рдкреНрд░рд▓реЗрдЦрди рдХреЗ рд▓рд┐рдП рдПрдХ рд▓рд┐рдВрдХ рдЫреЛрдбрд╝ рджреВрдВрдЧрд╛ рдФрд░ рдПрдХ рдЪрд┐рддреНрд░ рдХреЗ рд░реВрдк рдореЗрдВ рдЙрд╕рдореЗрдВ рд╕реЗ рдПрдХ рдХреЛрдб рдбрд╛рд▓реВрдВрдЧрд╛:


 type TypeName<T> = T extends string ? "string" : T extends number ? "number" : T extends boolean ? "boolean" : T extends undefined ? "undefined" : T extends Function ? "function" : "object"; type T0 = TypeName<string>; // "string" type T1 = TypeName<"a">; // "string" type T2 = TypeName<true>; // "boolean" type T3 = TypeName<() => void>; // "function" type T4 = TypeName<string[]>; // "object" 

рдпрд╣ рдХрд╛рд░реНрдп рд╣рдорд╛рд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ рдХреИрд╕реЗ рдорджрдж рдХрд░рддрд╛ рд╣реИред react-redux рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд╡рд┐рд╡рд░рдг рдХреЛ InferableComponentEnhancerWithProps , рдЖрдк InferableComponentEnhancerWithProps рдкреНрд░рдХрд╛рд░ рдкрд╛ рд╕рдХрддреЗ рд╣реИрдВ, рдЬреЛ рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЬрд╝рд┐рдореНрдореЗрджрд╛рд░ рд╣реИ рдХрд┐ рдЗрдВрдЬреЗрдХреНрдЯ рдХрд┐рдП рдЧрдП рдЧреБрдг рдмрд╛рд╣рд░реА рдкреНрд░рдХрд╛рд░ рдХреЗ рдШрдЯрдХ рдЧреБрдгреЛрдВ рдореЗрдВ рдирд╣реАрдВ рдЖрддреЗ рд╣реИрдВ, рдЬрд┐рд╕реЗ рд╣рдореЗрдВ рдШрдЯрдХ рдХреЛ рддрддреНрдХрд╛рд▓ рдХрд░рддреЗ рд╕рдордп рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рд╕реЗрдЯ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред InferableComponentEnhancerWithProps рдкреНрд░рдХрд╛рд░ рдХреЗ рджреЛ рд╕рд╛рдорд╛рдиреНрдп рдкреИрд░рд╛рдореАрдЯрд░ рд╣реИрдВ: TInjectedProps рдФрд░ TNeedsProps ред рд╣рдо рдкрд╣рд▓реЗ рдореЗрдВ рд░реБрдЪрд┐ рд░рдЦрддреЗ рд╣реИрдВред рдЪрд▓реЛ рдЗрд╕ рдХрдиреЗрдХреНрдЯрд░ рд╕реЗ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдХреЛ "рдЦреАрдВрдЪрдиреЗ" рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВ!


 type TypeOfConnect<T> = T extends InferableComponentEnhancerWithProps<infer Props, infer _> ? Props : never ; 

рдФрд░ рд╕реАрдзреЗ рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рд╕реЗ рдПрдХ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдЙрджрд╛рд╣рд░рдг рдкрд░ рдЯрд╛рдЗрдк рдХреЛ рдЦреАрдВрдЪрдирд╛ (рдЬрд┐рд╕реЗ рдЖрдк рдХреНрд▓реЛрди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рд╡рд╣рд╛рдВ рдПрдХ рдкрд░реАрдХреНрд╖рдг рдХрд╛рд░реНрдпрдХреНрд░рдо рдЪрд▓рд╛ рд╕рдХрддреЗ рд╣реИрдВ):


 import React from 'react'; import { connect } from 'react-redux'; import { RootStore, init, TypeOfConnect, thunkAction, unboxThunk } from 'src/redux'; const storeEnhancer = connect( (state: RootStore) => ({ ...state, }), { init, thunkAction: unboxThunk(thunkAction), } ); type AppProps = {} & TypeOfConnect<typeof storeEnhancer> ; class App extends React.PureComponent<AppProps> { componentDidMount() { this.props.init(); this.props.thunkAction(3000); } render() { return ( <> <div>{this.props.a}</div> <div>{this.props.b}</div> <div>{String(this.props.c)}</div> </> ); } } export default storeEnhancer(App); 

рдКрдкрд░ рдХреЗ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, рд╣рдо рджреЛ рдЪрд░рдгреЛрдВ рдореЗрдВ рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА (рд░реЗрдбрдХреНрд╕) рд╕реЗ рдХрдиреЗрдХреНрд╢рди рдХреЛ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд░рддреЗ рд╣реИрдВред рдкрд╣рд▓реЗ рдЪрд░рдг рдореЗрдВ, рд╣рдо рдЕрдкрдиреЗ TypeOfConnect рд╣реЗрд▓реНрдкрд░ TypeOfConnect рдФрд░ рдЖрдЧреЗ рд╕рдВрдпреЛрдЬрди ( & рдкреНрд░рдХрд╛рд░ рдХреЗ рдЪреМрд░рд╛рд╣реЗ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдкреНрд░рд╛рдкреНрдд рд╕рдВрдкрддреНрддрд┐ рдкреНрд░рдХрд╛рд░ рдХреЗ рдШрдЯрдХ рдХреЗ рдореВрд▓ рд╕рдВрдкрддреНрддрд┐ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд╕рд╛рде рдЗрд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рд╕реЗ InferableComponentEnhancerWithProps рд╕рдВрдкрддреНрддрд┐ рдкреНрд░рдХрд╛рд░ рдирд┐рдХрд╛рд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЙрдЪреНрдЪ-рдСрд░реНрдбрд░ рдШрдЯрдХ storeEnhancer (рдЙрд░реНрдл InferableComponentEnhancerWithProps ) рдкреНрд░рд╛рдкреНрдд рдХрд░рддреЗ рд╣реИрдВред рджреВрд╕рд░реЗ рдЪрд░рдг рдореЗрдВ, рд╣рдо рдмрд╕ рдЕрдкрдиреЗ рдореВрд▓ рдШрдЯрдХ рдХреЛ рд╕рдЬрд╛рддреЗ рд╣реИрдВред рдЕрдм, рдЬреЛ рднреА рдЖрдк рдХрдиреЗрдХреНрдЯрд░ рдореЗрдВ рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ, рд╡рд╣ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдШрдЯрдХ рд╕рдВрдкрддреНрддрд┐ рдкреНрд░рдХрд╛рд░реЛрдВ рдореЗрдВ рдЧрд┐рд░ рдЬрд╛рдПрдЧрд╛ред рдорд╣рд╛рди, рдЬреЛ рд╣рдо рд╣рд╛рд╕рд┐рд▓ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рдереЗ!


рдПрдХ рдЪреМрдХрд╕ рдкрд╛рдардХ рдиреЗ рджреЗрдЦрд╛ рдХрд┐ рд╕рд╛рдЗрдб рдЗрдлреЗрдХреНрдЯреНрд╕ (рдердВрдХ рдПрдХреНрд╢рди рдХреНрд░рд┐рдПрдЯрд░реНрд╕) рдХреЗ рд╕рд╛рде рдПрдХреНрд╢рди рдЬрдирд░реЗрдЯрд░ (рд╕рдВрдХреНрд╖рд┐рдкреНрддрддрд╛ рдХреЗ рд▓рд┐рдП, рд╣рдо рдХрд╛рд░реНрд░рд╡рд╛рдИ рдХреЗ рд▓рд┐рдП рд╢рдмреНрдж рдХреЛ рд╕рд░рд▓ рдмрдирд╛рддреЗ рд╣реИрдВ) unboxThunk рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЕрддрд┐рд░рд┐рдХреНрдд рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рд╕реЗ unboxThunk рд╣реИрдВред рдЗрд╕ рддрд░рд╣ рдХреЗ рдПрдХ рдЕрддрд┐рд░рд┐рдХреНрдд рдЙрдкрд╛рдп рдХрд╛ рдХреНрдпрд╛ рдХрд╛рд░рдг рд╣реИ? рдЪрд▓реЛ рдареАрдХ рд╣реИред рдкрд╣рд▓реЗ, рдЪрд▓реЛ рд░рд┐рдкреЛрдЬрд┐рдЯрд░реА рд╕реЗ рдПрдХ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХреЗ рдЙрджрд╛рд╣рд░рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП рдЗрд╕ рддрд░рд╣ рдХреЗ рдПрдХ рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдХреЛ рджреЗрдЦреЗрдВ:


 const thunkAction = (delay: number): ThunkAction<void, RootStore, void, AnyAction> => (dispatch) => { console.log('waiting for', delay); setTimeout(() => { console.log('reset'); dispatch(reset()); }, delay); }; 

рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рд╕реЗ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рд╣рдорд╛рд░реА рдХрд╛рд░реНрд░рд╡рд╛рдИ рддреБрд░рдВрдд рд▓рдХреНрд╖реНрдп рдлрд╝рдВрдХреНрд╢рди рдХреЛ рд╡рд╛рдкрд╕ рдирд╣реАрдВ рдХрд░рддреА рд╣реИ, рд▓реЗрдХрд┐рди рдкрд╣рд▓реЗ рдПрдХ рдордзреНрдпрд╡рд░реНрддреА рд╣реИ, рдЬреЛ рд╣рдорд╛рд░реЗ рдореБрдЦреНрдп рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ рд╕рд╛рдЗрдб рдЗрдлреЗрдХреНрдЯреНрд╕ рдХреЛ рд╕рдХреНрд╖рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП redux-middleware рдЙрдард╛рддрд╛ рд╣реИред рд▓реЗрдХрд┐рди рдШрдЯрдХ рдХреЗ рдЧреБрдгреЛрдВ рдореЗрдВ рдЬреБрдбрд╝реЗ рд╣реБрдП рд░реВрдк рдореЗрдВ рдЗрд╕ рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╕рдордп, рдордзреНрдпрд╡рд░реНрддреА рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдЫреЛрдбрд╝рдХрд░, рдЗрд╕ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдХрдо рд╣реЛ рдЬрд╛рддреЗ рд╣реИрдВред рдЗрд╕реЗ рдкреНрд░рдХрд╛рд░реЛрдВ рдореЗрдВ рдХреИрд╕реЗ рд╡рд░реНрдгрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдП? рдПрдХ рд╡рд┐рд╢реЗрд╖ рдХрдирд╡рд░реНрдЯрд░ рдлрд╝рдВрдХреНрд╢рди рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдлрд┐рд░ рд╕реЗ рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдЕрдкрдиреА рд╢рдХреНрддрд┐ рджрд┐рдЦрд╛рддрд╛ рд╣реИред рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рд╣рдо рдЙрд╕ рдкреНрд░рдХрд╛рд░ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рддреЗ рд╣реИрдВ рдЬреЛ рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рд╕реЗ рдордзреНрдпрд╡рд░реНрддреА рдХрд╛рд░реНрдп рдХреЛ рд╣рдЯрд╛рддрд╛ рд╣реИ:


 CutMiddleFunction<T> = T extends (...arg: infer Args) => (...args: any[]) => infer R ? (...arg: Args) => R : never ; 

рдпрд╣рд╛рдВ, рд╕рд╢рд░реНрдд рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рдЕрд▓рд╛рд╡рд╛, рд╣рдо рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ 3.0 рд╕реЗ рдПрдХ рдмрд╣реБрдд рд╣рд╛рд▓рд┐рдпрд╛ рдирд╡рд╛рдЪрд╛рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рдЬреЛ рд╣рдореЗрдВ рдлрд╝рдВрдХреНрд╢рди рддрд░реНрдХреЛрдВ рдХреА рдПрдХ рдордирдорд╛рдиреА (рдмрд╛рдХреА рдорд╛рдкрджрдВрдбреЛрдВ) рдХреА рд╕рдВрдЦреНрдпрд╛ рдХреЛ рдХрдо рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рд╡рд┐рд╡рд░рдг рдХреЗ рд▓рд┐рдП рджрд╕реНрддрд╛рд╡реЗрдЬ рджреЗрдЦреЗрдВред рдЕрдм рдпрд╣ рдХрдареЛрд░ рдХрд╛рд░реНрд░рд╡рд╛рдИ рдХреЗ рдмрдЬрд╛рдп рд╣рдорд╛рд░реА рдХрд╛рд░реНрд░рд╡рд╛рдИ рд╕реЗ рдЕрддрд┐рд░рд┐рдХреНрдд рд╣рд┐рд╕реНрд╕реЗ рдХреЛ рдХрд╛рдЯрдиреЗ рдХреЗ рд▓рд┐рдП рдмрдирд╛ рд╣реБрдЖ рд╣реИ:


 const unboxThunk = <Args extends any[], R, S, E, A extends Action<any>>( thunkFn: (...args: Args) => ThunkAction<R, S, E, A>, ) => ( thunkFn as any as CutMiddleFunction<typeof thunkFn> ); 

рдЗрд╕ рддрд░рд╣ рдХреЗ рдПрдХ рдХрдирд╡рд░реНрдЯрд░ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдХрд╛рд░реНрд░рд╡рд╛рдИ рдХреЛ рдкрд╛рд░ рдХрд░рддреЗ рд╣реБрдП, рд╣рдореЗрдВ рдЖрдЙрдЯрдкреБрдЯ рдкрд░ рд╣рдорд╛рд░реА рдЬрд╝рд░реВрд░рдд рдХреЗ рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдорд┐рд▓рддреЗ рд╣реИрдВред рдЕрдм рдХрдиреЗрдХреНрдЯрд░ рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХреЗ рд▓рд┐рдП рдХрд╛рд░реНрд░рд╡рд╛рдИ рддреИрдпрд╛рд░ рд╣реИред


рдЗрд╕рд▓рд┐рдП, рд╕рд░рд▓ рдЬреЛрдбрд╝рддреЛрдбрд╝ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ, рд╣рдо рдЕрдкрдиреЗ рд╕реНрдЯреИрдХ рдкрд░ рдЯрд╛рдЗрдк рдХрд┐рдП рдЧрдП рдХреЛрдб рдХреЛ рд▓рд┐рдЦрддреЗ рд╕рдордп рдЕрдкрдиреЗ рдореИрдиреБрдЕрд▓ рдХрд╛рдо рдХреЛ рдХрдо рдХрд░рддреЗ рд╣реИрдВред рдпрджрд┐ рд╣рдо рдереЛрдбрд╝рд╛ рдФрд░ рдЖрдЧреЗ рдмрдврд╝рддреЗ рд╣реИрдВ, рддреЛ рд╣рдо рдХрд╛рд░реНрд░рд╡рд╛рдИ рдФрд░ рд░реАрдбреНрдпреВрд╕рд░ рдХреА рдЯрд╛рдЗрдкрд┐рдВрдЧ рдХреЛ рднреА рд╕рд░рд▓ рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ, рдЬреИрд╕рд╛ рдХрд┐ рд╣рдордиреЗ redux-modus рдореЗрдВ рдХрд┐рдпрд╛ рдерд╛ред


PS рдЬрдм рдлрд╝рдВрдХреНрд╢рди рдФрд░ redux.bindActionCreators рдорд╛рдзреНрдпрдо рд╕реЗ рдХрдиреЗрдХреНрдЯрд░ рдореЗрдВ рдХреНрд░рд┐рдпрд╛рдУрдВ рдХреЗ рдЧрддрд┐рд╢реАрд▓ рдмрдВрдзрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ redux.bindActionCreators рддреЛ рд╣рдореЗрдВ рдЗрд╕ рдЙрдкрдпреЛрдЧрд┐рддрд╛ рдХреЗ рдЕрдзрд┐рдХ рдЙрдЪрд┐рдд рдкреНрд░рдХрд╛рд░ рдХреА рджреЗрдЦрднрд╛рд▓ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА (рд╕рдВрднрд╡рддрдГ рд╣рдорд╛рд░реЗ рдЕрдкрдиреЗ рдЖрд╡рд░рдг рд▓рд┐рдЦрдХрд░)ред


рдЕрдкрдбреЗрдЯ 0
рдЕрдЧрд░ рдХрд┐рд╕реА рдХреЛ рд▓рдЧрд╛ рдХрд┐ рдпрд╣ рд╕рдорд╛рдзрд╛рди рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╣реИ, рддреЛ рдЖрдк рдЗрд╕реЗ рдкрд╕рдВрдж рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рддрд╛рдХрд┐ @types/react-redux рдореЗрдВ рдЯрд╛рдЗрдк рдЙрдкрдпреЛрдЧрд┐рддрд╛ рдХреЛ рдЬреЛрдбрд╝рд╛ рдЬрд╛рдПред


рдЕрдкрдбреЗрдЯ рез
рдХреБрдЫ рдФрд░ рдкреНрд░рдХрд╛рд░ рдЬрд┐рдирдХреЗ рд╕рд╛рде рдЖрдкрдХреЛ рд╣реЙрдХ рдХреЗ рдЗрдВрдЬреЗрдХреНрд╢рди рдХреЗ рдкреНрд░рдХрд╛рд░ рдХреЛ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред рдмрд╕ рд╣реЛрдХреА рд▓реЗрдВ рдФрд░ рдЙрдирдореЗрдВ рд╕реЗ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЛ рдмрд╛рд╣рд░ рдирд┐рдХрд╛рд▓реЗрдВ:


 export type BasicHoc<T> = (Component: React.ComponentType<T>) => React.ComponentType<any>; export type ConfiguredHoc<T> = (...args: any[]) => (Component: React.ComponentType<T>) => React.ComponentType<any>; export type BasicHocProps<T> = T extends BasicHoc<infer Props> ? Props : never; export type ConfiguredHocProps<T> = T extends ConfiguredHoc<infer Props> ? Props : never; export type HocProps<T> = T extends BasicHoc<any> ? BasicHocProps<T> : T extends ConfiguredHoc<any> ? ConfiguredHocProps<T> : never ; const basicHoc = (Component: React.ComponentType<{a: number}>) => class extends React.Component {}; const configuredHoc = (opts: any) => (Component: React.ComponentType<{a: number}>) => class extends React.Component {}; type props1 = HocProps<typeof basicHoc>; // {a: number} type props2 = HocProps<typeof configuredHoc>; // {a: number} 

Update2
рд╡рд┐рд╖рдп рд╕реЗ рдкреНрд░рдХрд╛рд░ рдЕрдм @types/react-redux ( рдХрдиреЗрдХреНрдЯреЗрдбрдкреНрд░реЙрдкреНрд╕ ) рдореЗрдВ рд╣реИред

Source: https://habr.com/ru/post/hi431452/


All Articles