Definitelytyped: рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛-рд░реЗрдбрдХреНрд╕ рдХреЗ `рдХрдиреЗрдХреНрдЯ` рдХрд╛ рдЙрдкрдпреЛрдЧ рдбреЗрдХреЛрд░реЗрдЯрд░ рдХреЗ рд░реВрдк рдореЗрдВ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ: рдЯрд╛рдЗрдк рдХрд░реЗрдВ "рд╢реВрдиреНрдп' рдЯрд╛рдЗрдк рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрд╕рд╛рдЗрди рдХрд░рдиреЗ рдпреЛрдЧреНрдп рдирд╣реАрдВ рд╣реИ"

рдХреЛ рдирд┐рд░реНрдорд┐рдд 4 рдЬреБрд▓ре░ 2016  ┬╖  32рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ  ┬╖  рд╕реНрд░реЛрдд: DefinitelyTyped/DefinitelyTyped

рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛-рд░реЗрдбрдХреНрд╕ рдХреЗ connect рдХреЛ рдХреНрд▓рд╛рд╕ рдбреЗрдХреЛрд░реЗрдЯрд░ рдХреЗ рд░реВрдк рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░рдиреЗ рд╕реЗ рдлреЙрд░реНрдо рдХреЗ рддреНрд░реБрдЯрд┐ рд╕рдВрджреЗрд╢ Type 'foo' is not assignable to type 'void' ред рдЗрди рдЯрд╛рдЗрдкрд┐рдВрдЧ рдХреЗ рд╕рд╛рде рд╕рдорд╕реНрдпрд╛ рдпрд╣ рдкреНрд░рддреАрдд рд╣реЛрддреА рд╣реИ рдХрд┐ рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ ClassDecorator s рдХреЛ рдЙрд╕ рдЪреАрдЬрд╝ рдХреЗ рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдХреЛ рдмрджрд▓рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рдирд╣реАрдВ рджреЗрддрд╛ рд╣реИ рдЬрд┐рд╕реЗ рд╡реЗ рд╕рдЬрд╛рддреЗ рд╣реИрдВ , рд▓реЗрдХрд┐рди рдпрд╣ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛-рд░реЗрдбрдХреНрд╕ рдЯрд╛рдЗрдкрд┐рдВрдЧ рдХрд╛ рд╡рд░реНрддрдорд╛рди рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╣реИ рдФрд░ рдЙрджреНрджреЗрд╢реНрдпрдкреВрд░реНрдг рддрд░реАрдХреЗ рд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛-рд░реЗрдбрдХреНрд╕ рдкреНрд░реЙрдкреНрд╕ рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрд▓рдЧ рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдХреЗ рд╕рд╛рде рдПрдХ рдЕрд▓рдЧ рдЙрджрд╛рд╣рд░рдг рджреЗрддрд╛ рд╣реИ ред

рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд░реВрдк рдореЗрдВ connect рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЕрдкреЗрдХреНрд╖рд╛ рдХреЗ рдЕрдиреБрд░реВрдк рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ; рдпрд╣ рдХреЗрд╡рд▓ рдПрдХ рдбреЗрдХреЛрд░реЗрдЯрд░ рдХреЗ рд░реВрдк рдореЗрдВ рдЙрдкрдпреЛрдЧ рд╣реИ рдЬреЛ рдкреНрд░рдХрд╛рд░ рдХреА рд╕рдорд╕реНрдпрд╛рдУрдВ рдХрд╛ рдХрд╛рд░рдг рдмрдирддрд╛ рд╣реИред

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

рдореБрдЭреЗ рдирд╣реАрдВ рдкрддрд╛ рдХрд┐ рдбреЗрдХреЛрд░реЗрдЯрд░-рдЯрд╛рдЗрдкрд┐рдВрдЧ рд╕рдорд╕реНрдпрд╛ рдХрд╛ рдкреВрд░реНрдг рд╕рдорд╛рдзрд╛рди рд╕рдВрднрд╡ рд╣реИ, рдЬрдмрдХрд┐ https://github.com/Microsoft/TypeScript/issues/4881 рдмрдХрд╛рдпрд╛ рд╣реИред рдЙрд╕ рдиреЗ рдХрд╣рд╛, рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ рд╡реГрджреНрдзрд┐рд╢реАрд▓ рд╕реБрдзрд╛рд░ рд╣реИрдВ, рдЬреИрд╕реЗ рдХрд┐ (рдкреНрд░рдердо рдкрд╛рд╕) рдХрд┐рд╕реА рднреА рдкреНрд░рдХрд╛рд░ рдХреЗ React.ComponentClass рдЖрдЙрдЯрдкреБрдЯ рдХрд░рдирд╛ рддрд╛рдХрд┐ рдХреЛрдб рдХрдо рд╕реЗ рдХрдо рд╕рдВрдХрд▓рд┐рдд рд╣реЛ, рдлрд┐рд░ (рджреВрд╕рд░рд╛ рдкрд╛рд╕) рдПрдХ рдШрдЯрдХ рдХреЛ рдЖрдЙрдЯрдкреБрдЯ рдХрд░рддрд╛ рд╣реИ рдЬреЛ рд╕рднреА рдХреЗ рдЪреМрд░рд╛рд╣реЗ рдХреЛ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рддрд╛ рд╣реИ рдкреНрд░реЙрдкреНрд╕ (рд╕реНрд╡рдпрдВ рдХреЗ рд╕рд╛рде-рд╕рд╛рде рдЬреБрдбрд╝рд╛ рд╣реБрдЖ), рднрд▓реЗ рд╣реА рд╡рд╣ рдмрд╣реБрдд рдЙрджрд╛рд░ рд╣реЛрдЧрд╛, рдЗрд╕рд▓рд┐рдП рдХреЛрдб рдкреНрд░рдХрд╛рд░ рдХрдо рд╕реЗ рдХрдо рдХреБрдЫ рдкреНрд░реЙрдкреНрд╕ рдХреА рдЬрд╛рдВрдЪ рдХрд░рддрд╛ рд╣реИред

рдореЗрд░реЗ рдкрд╛рд╕ рдЕрднреА рдПрдХрдорд╛рддреНрд░ рд╕рдорд╛рдзрд╛рди connect рдХреЛ рдбреЗрдХреЛрд░реЗрдЯрд░ рдХреЗ рд░реВрдк рдореЗрдВ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░рдирд╛ рд╣реИред рдХреБрдЫ рдХреЛ рдпрд╣ рд╢реИрд▓реАрдЧрдд рд░реВрдк рд╕реЗ рдмрджрд╕реВрд░рдд рд▓рдЧ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рд╕рд╣реА рдврдВрдЧ рд╕реЗ рдЯрд╛рдЗрдк-рдЪреЗрдХ рдХрд░рддрд╛ рд╣реИ, рдХреЛрдИ рд▓рдВрдмрд╛ рдирд╣реАрдВ рд╣реИ рдФрд░ рдПрдХ рдбреЗрдХреЛрд░реЗрдЯрд░ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдЕрдзрд┐рдХ рд╕реНрдерд╛рдиреЛрдВ рдкрд░ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдпреЛрдЧреНрдп рд╣реИред

рдХреЗ рдмрдЬрд╛рдП:

@connect(mapStateToProps, mapDispatchToProps)
class MyComponent extends React.Component<...> { ... }

рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ (рдХреА рддрд░реНрдЬ рдкрд░ рдХреБрдЫ):

class MyComponentImpl extends React.Component<...> { ... }
const MyComponent = connect(mapStateToProps, mapDispatchToProps)(MyComponentImpl);

рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ https://github.com/DefinitelyTyped/DefinitelyTyped/issues/8787 рдпрд╣рд╛рдВ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ рдФрд░ рдХрднреА-рдХрднреА рдЗрд╕ рдореБрджреНрджреЗ рд╕реЗ рдЬреБрдбрд╝рд╛ рд╣реЛрддрд╛ рд╣реИред рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ рдЖрдЙрдЯрдкреБрдЯ рдШрдЯрдХ рдХрд╛ рдЙрдЪрд┐рдд рдкреНрд░рдХрд╛рд░ рд╣реИ, рдЖрдк рдПрдХ рдкреНрд░рдХрд╛рд░ рдХрд╛ рд╕рдВрдХреЗрдд рдпрд╛ рдХрд╛рд╕реНрдЯ рднреА рдЪрд╛рд╣рддреЗ рд╣реИрдВред

рд╕рдВрдкрд╛рджрд┐рдд рдХрд░реЗрдВ: https://github.com/Microsoft/TypeScript/pull/12114 рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ рдорджрдж рдХрд░ рд╕рдХрддрд╛ рд╣реИ: рдбреЗрдХреЛрд░реЗрдЯрд░ рд╕рдВрднрд╛рд╡рд┐рдд рд░реВрдк рд╕реЗ рдЬреЗрдирд░реЗрдЯ рдХрд┐рдП рдЧрдП рдШрдЯрдХ рдХреЗ рд▓рд┐рдП рдкреНрд░реЛрдк рдХрд╛ рдПрдХ рд╡реИрдХрд▓реНрдкрд┐рдХ рд╕рдВрд╕реНрдХрд░рдг рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рд▓рд┐рдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдЬреЛ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЖрджрд░реНрд╢ рдирд╣реАрдВ рд╣реИ рд▓реЗрдХрд┐рди рдЖрдкрдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЛ рдкреНрд░реЛрдк рдирд▓рд┐рдЯреА рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЕрдзрд┐рдХ рдореБрдЦрд░ рд╣реЛрдиреЗ рджреЗрдирд╛ рдЬрд╛рд░реА рд░рдЦрддрд╛ рд╣реИред

рд╕рдмрд╕реЗ рдЙрдкрдпреЛрдЧреА рдЯрд┐рдкреНрдкрдгреА

рд╕реАрдзреЗ @connect рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП (рдЗрд╕рд▓рд┐рдП рдХрд╕реНрдЯрдо рдбреЗрдХреЛрд░реЗрдЯрд░реНрд╕ рдХреЛ рдкреЗрд╢ рдХрд┐рдП рдмрд┐рдирд╛) рдореИрдВ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╡рд░реНрдХрдЕрд░рд╛рдЙрдВрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реВрдВ:

@(connect(mapStateToProps, mapDispatchToProps) as any)
class MyComponent extends React.Component<...> {...}

рд▓реЗрдХрд┐рди рдореИрдВ @seansfkelley рд╕реЗ рдкреВрд░реА рддрд░рд╣ рд╕рд╣рдордд

рд╕рднреА 32 рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

рдореИрдВ рджреВрд╕рд░реЗ рджрд┐рди рдЗрд╕реА рддрд░рд╣ рдХреЗ рдореБрджреНрджреЛрдВ рдкрд░ рдерд╛ рдФрд░ рдЗрд╕реЗ рдХрдиреЗрдХреНрдЯ рдлрдВрдХ рдХреЗ рд▓рд┐рдП рдЫреЛрдбрд╝ рджрд┐рдпрд╛ред рдкреНрд░рдХрд╛рд░ рдмрдВрдж рджрд┐рдЦрддреЗ рд╣реИрдВ рдФрд░ рдкреБрд░рд╛рдиреЗ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдкреНрд░рдХрд╛рд░реЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред рдореИрдВ рдЗрд╕реЗ рдареАрдХ рдХрд░рдиреЗ рдФрд░ рдкреАрдЖрд░ рдЬрдорд╛ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВ?

рдмреЗрд╢рдХ! рдЗрди рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЛ рдореВрд▓ рд░реВрдк рд╕реЗ рд▓рд┐рдЦреЗ рдЬрд╛рдиреЗ рдХреЗ рдмрд╛рдж рд╕реЗ рдмрд╣реБрдд рдХреБрдЫ рдмрджрд▓ рдЧрдпрд╛ рд╣реИ, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдореБрдЭреЗ рдЕрднреА рднреА рд╕рдВрджреЗрд╣ рд╣реИ рдХрд┐ рдЙрддреНрдкрд░рд┐рд╡рд░реНрддрди-рд╕рдЬреНрдЬрд╛рдХрд╛рд░ рд╕рдорд░реНрдерди рдХреЗ рдмрд┐рдирд╛ рдХреБрдЫ рдЙрдкрдпреЛрдЧреА рд╕рдВрднрд╡ рд╣реИред рд▓реЗрдХрд┐рди рдореИрдВрдиреЗ рдкрд╣рд▓реЗ рдЯрд╛рдЗрдк рд╕рд┐рд╕реНрдЯрдо рдореЗрдВ рдЕрдиреНрдп рдЕрдкрд░реНрдпрд╛рдкреНрддрддрд╛рдУрдВ рдХреЗ рдЖрд╕рдкрд╛рд╕ рдХрд╛рдо рдХрд┐рдпрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЗрд╕реЗ рдПрдХ рд╢реЙрдЯ рджреЗрдВред

рд╢рд╛рдпрдж рдореИрдк рдХрд┐рдП рдЧрдП рдкреНрд░рдХрд╛рд░ рдЖрдкрдХреЛ рд╡рд╣рд╛рдВ рдХреЗ рд░рд╛рд╕реНрддреЗ рдХрд╛ рд╣рд┐рд╕реНрд╕рд╛ рдорд┐рд▓ рд╕рдХрддреЗ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рдХрдо рд╕реЗ рдХрдо рдЖрдкрдХреЗ рдкрд╛рд╕ рдЖрдЙрдЯрдкреБрдЯ рдореЗрдВ _some_ рдЙрдкрдпреЛрдЧреА рдкреНрд░рдХрд╛рд░ рдХреА рдЬрд╛рдирдХрд╛рд░реА рд╣реИ?

рдпреЛрд▓реЛ

export function myConnect(mapStateToProps, mapDispatchToProps) {
    return function (target) {
        return <any>connect(mapStateToProps, mapDispatchToProps)(target);
    }
}

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

рд╕реАрдзреЗ @connect рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП (рдЗрд╕рд▓рд┐рдП рдХрд╕реНрдЯрдо рдбреЗрдХреЛрд░реЗрдЯрд░реНрд╕ рдХреЛ рдкреЗрд╢ рдХрд┐рдП рдмрд┐рдирд╛) рдореИрдВ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╡рд░реНрдХрдЕрд░рд╛рдЙрдВрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реВрдВ:

@(connect(mapStateToProps, mapDispatchToProps) as any)
class MyComponent extends React.Component<...> {...}

рд▓реЗрдХрд┐рди рдореИрдВ @seansfkelley рд╕реЗ рдкреВрд░реА рддрд░рд╣ рд╕рд╣рдордд

рдбреЗрдХреЛрд░реЗрдЯрд░ рд╕рд┐рдВрдЯреИрдХреНрд╕ рд╢рд╛рдВрдд рд╣реЛрдиреЗ рдХреЗ рдмрд╛рд╡рдЬреВрдж, рдореБрдЭреЗ рдЕрднреА рднреА рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдПрдЪрдУрд╕реА рдЬреИрд╕реЗ рдХрдиреЗрдХреНрдЯ рдХреЛ рдорд╛рдирдХ рддрд░реАрдХреЗ рд╕реЗ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдПрдХ рдмреЗрд╣рддрд░ рдЕрднреНрдпрд╛рд╕ рд╣реИред

1) рдпрд╣ рдПрдХ рд╡рд░реНрдЧ рдХреЗ рдкреНрд░рдХрд╛рд░ рдХреЛ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░рддрд╛ рд╣реИ рдЬреЛ рдбреЗрдХреЛрд░реЗрдЯрд░ рд╕реНрдкреЗрдХ рдХреЗ рдЦрд┐рд▓рд╛рдл рдЬрд╛рддрд╛ рд╣реИред
2) рдХрдиреЗрдХреНрдЯ рдПрдХ рдбреЗрдХреЛрд░реЗрдЯрд░ рдирд╣реАрдВ рд╣реИ, рдпрд╣ рдПрдХ рдПрдЪрдУрд╕реА рд╣реИред
3) рдпрд╣ рд╕реНрдЯреЗрдЯрд▓реЗрд╕ рдФрд░ рд╕реНрдЯреЗрдЯрдлреБрд▓ рдШрдЯрдХреЛрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрд▓рдЧ рд╕рд┐рдВрдЯреИрдХреНрд╕ рд╣реЛрдиреЗ рд╕реЗ рдХреЛрдб рдХреА рдкреЛрд░реНрдЯреЗрдмрд┐рд▓рд┐рдЯреА рдХреЛ рддреЛрдбрд╝рддрд╛ рд╣реИред

рддреЛ рдореИрдВ рдХреГрдкрдпрд╛ рдХрд╣рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ, рдРрд╕реА рдкрд░рд┐рднрд╛рд╖рд╛ рдкреНрд░рджрд╛рди рди рдХрд░реЗрдВ рдЬреЛ рджреЗрд╡ рдХреЛ рдЧрд▓рдд рддрд░реАрдХреЗ рд╕реЗ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗ :)

@npirotte рд╕рд╣рдордд рд╣реИрдВред рдЖрдк рдмрд┐рд▓реНрдХреБрд▓ рд╕рд╣реА рд╣реИрдВ, рдПрдЪрдУрд╕реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдбреЗрдХреЛрд░реЗрдЯрд░реНрд╕ рдХреЗ рд░реВрдк рдореЗрдВ рдХрд░рдирд╛ рдбреЗрдХреЛрд░реЗрдЯрд░реНрд╕ рд╕реНрдкреЗрдХ рдХрд╛ рдЙрд▓реНрд▓рдВрдШрди рдХрд░рддрд╛ рд╣реИред рдпрд╣ рдЕрдм рдмреЗрд╕ рдХреНрд▓рд╛рд╕ рдирд╣реАрдВ рд╣реИ рдмрд▓реНрдХрд┐ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЕрд▓рдЧ рд╣реИред

рдореЗрд░реЗ рдкрд╛рд╕ рдХрд╕реНрдЯрдо рдбреЗрдХреЛрд░реЗрдЯрд░реНрд╕ рдХреЗ рд╕рд╛рде рд╕рдорд╛рди рд╕рдЯреАрдХ рд╕рдорд╕реНрдпрд╛рдПрдВ рд╣реИрдВ рдФрд░ рдЯреАрдПрд╕ рдореЗрдВ рдЙрдирдХреЗ рд╕рдорд░реНрдерди рдХреА рд╕реНрдерд┐рддрд┐ рдХреЛ рджреЗрдЦ рд░рд╣реЗ рд╣реИрдВ (рд╡реЗ рдЕрднреА рднреА рдзреНрд╡рдЬ рдХреЗ рдкреАрдЫреЗ рд╣реИрдВ рдФрд░ рдПрдПрдлрдПрдЖрдИрд╕реАрдПрд╕ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ рдЙрдиреНрд╣реЗрдВ рд╕рдХреНрд╖рдо рдХрд░рдиреЗ рдХреА рдХреЛрдИ рдпреЛрдЬрдирд╛ рдирд╣реАрдВ рд╣реИ) рдореИрдВ рд╕рдорд░реНрдерди рдЫреЛрдбрд╝рдиреЗ рд╡рд╛рд▓рд╛ рд╣реВрдВ рдЙрдиреНрд╣реЗрдВред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛ рд╕рдЬреНрдЬрд╛рдХрд╛рд░ рдЕрднреА рднреА w3c рдбреНрд░рд╛рдлреНрдЯ рдореЗрдВ рд╣реИрдВред

рдПрдХ рдШрдЯрдХ рдХреЛ рдПрдХ рдирдП рдореЗрдВ рд▓рдкреЗрдЯрдиреЗ рдХрд╛ рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рддрд░реАрдХрд╛ _decorate_ рдореМрдЬреВрджрд╛ рд╡рд░реНрдЧ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рдиреЗ рдХреЗ рдмрдЬрд╛рдп рдЗрд╕рдХреЗ рд▓рд┐рдП рдПрдХ рдЙрдЪреНрдЪ рдСрд░реНрдбрд░ рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╣реИред

рдЕрдЧрд░ рдореИрдВ рдЗрд╕реЗ рдЖрдпрд╛рдд рдХрд░рддрд╛ рд╣реВрдВ рддреЛ рдореБрдЭреЗ рдПрдХ рд╣реА рддреНрд░реБрдЯрд┐ рд╣реИред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдореЗрд░реЗ рд▓рд┐рдП рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ:

const { connect } = require('react-redux');

@connect(mapStateToProps, mapDispatchToProps)
class MyComponent extends React.Component<...> { ... }

@TriStarGod рдЬреЛ рдЗрд╕ рдмрд╛рдд рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдЖрдкрдиреЗ require рдХреИрд╕реЗ рдЯрд╛рдЗрдк рдХрд┐рдпрд╛ рд╣реИред рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЖрдк рдЙрд╕ рд╕реНрдерд┐рддрд┐ рдореЗрдВ connect рдЯрд╛рдЗрдк рдХрд░рдХреЗ any рд╕рд╛рде рд╕рдорд╛рдкреНрдд рдХрд░ рд░рд╣реЗ рд╣реИрдВред

рдПрдХ рдФрд░ рд╕рдорд╛рдзрд╛рди/рд╕рдорд╛рдзрд╛рдиред

рдЪреВрдВрдХрд┐ рдореЗрд░реЗ рдкрд╛рд╕ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЕрдкрдирд╛ рдРрдк рд╕реНрдЯреЗрдЯ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдореБрдЭреЗ рдЗрд╕ рд░реВрдк рдореЗрдВ рдХреБрдЫ рдмрд╣реБрдд рд╣реА рдХрдо рдлрд╝рдВрдХреНрд╢рди рдЪрд╛рд╣рд┐рдП:

export interface PageProps {
    routing: RouterState;
}

export interface PageDispatch {
    navigate: () => void
}

@connect<PageProps, PageDispatch>(
    state => ({
        routing: state.routing
    }),
    dispatch => ({
        navigate: () => dispatch(push("/"))
    })
)
export class Page extends React.Component<PageProps & PageDispatch> {
...
}

рдФрд░ рдпрд╣рд╛рдБ рд╡рд╣ рд▓рд┐рдкрдЯреЗ рдХрдиреЗрдХреНрдЯ рд╡рд┐рдзрд┐ рд╣реИ:

import { connect } from "react-redux";
import { ApplicationState } from './rootReducer';

interface MapPropsParam<TProps>{
    (state: ApplicationState, ownProps?: TProps): TProps
}

interface MapDispatchParam<TProps, TDispatchProps>{
   (dispatch: Redux.Dispatch<ApplicationState>, ownProps?: TProps): TDispatchProps;
}

export interface ConnectedComponent<TProps> {
    <TComponent extends React.ComponentType<TProps>>(component: TComponent): TComponent;
}

function connectToAppState<TProps, TDispatchProps = {}>(mapProps: MapPropsParam<TProps>, mapDispatch?: MapDispatchParam<TProps, TDispatchProps>) : ConnectedComponent<TProps> {
    return connect<TProps, TDispatchProps, TProps>(mapProps, mapDispatch) as ConnectedComponent<TProps & TDispatchProps>;    
}

export {
    connectToAppState as connect
}

рдЖрдкрдХреЗ рдХрд╛рдо рдХреЗ рд▓рд┐рдП Thxред рд╕рджрд╕реНрдпрддрд╛ рд▓реЗрдирд╛ рдФрд░ рдЗрд╕ рдореБрджреНрджреЗ рдкрд░ рдкреНрд░рдЧрддрд┐ рдХреА рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░рдирд╛ред

@offbeatful рдХреГрдкрдпрд╛ рдЕрдиреНрдп рд╡рд┐рд╡рд┐рдзрддрд╛рдУрдВ рдХреА рдШреЛрд╖рдгрд╛ рдЯрд╛рдЗрдк рдХрд░реЗрдВ

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

@offbeatful рдЯрд┐рдкреНрдкрдгреА рдкрд░ рдЖрдзрд╛рд░рд┐рдд рдПрдХ рдФрд░ рд╕рдорд╛рдзрд╛рди

myConnect.ts

import {
    connect as originalConnect, MapDispatchToPropsParam, MapStateToPropsParam, MergeProps, Options
} from "react-redux";
import * as React from "react";

export interface InferableComponentEnhancerWithProps<TInjectedProps, TNeedsProps> {
    <TComponent extends React.ComponentType<TInjectedProps & TNeedsProps>>(component: TComponent): TComponent;
}

interface MyConnect {
    <TStateProps = {}, TDispatchProps = {}, TOwnProps = {}>(
        mapStateToProps?: MapStateToPropsParam<TStateProps, TOwnProps>,
        mapDispatchToProps?: MapDispatchToPropsParam<TDispatchProps, TOwnProps>
    ): InferableComponentEnhancerWithProps<TStateProps & TDispatchProps, TOwnProps>;

    <TStateProps = {}, TDispatchProps = {}, TOwnProps = {}, TMergedProps = {}>(
        mapStateToProps?: MapStateToPropsParam<TStateProps, TOwnProps>,
        mapDispatchToProps?: MapDispatchToPropsParam<TDispatchProps, TOwnProps>,
        mergeProps?: MergeProps<TStateProps, TDispatchProps, TOwnProps, TMergedProps>,
        options?: Options<TStateProps, TOwnProps, TMergedProps>
    ): InferableComponentEnhancerWithProps<TMergedProps, TOwnProps>;

}

export const connect = originalConnect as MyConnect;

@pravdomil рд╕реНрдирд┐рдкреЗрдЯ рдФрд░ рдирд╡реАрдирддрдо рдкреНрд░рдХрд╛рд░реЛрдВ (5.0.13) рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдЕрдкрдбреЗрдЯ рдХрд┐рдпрд╛ рдЧрдпрд╛

import { ApplicationState } from "./rootReducer";

import * as React from "react";
import {
    connect as originalConnect, MapDispatchToPropsParam, MapStateToPropsParam, MergeProps, Options
} from "react-redux";

export type InferableComponentEnhancerWithProps<TInjectedProps, TNeedsProps> = <TComponent extends React.ComponentType<TInjectedProps & TNeedsProps>>(component: TComponent) => TComponent;

interface MyConnect {
    <TStateProps = {}, TDispatchProps = {}, TOwnProps = {}>(
        mapStateToProps?: MapStateToPropsParam<TStateProps, TOwnProps, ApplicationState>,
        mapDispatchToProps?: MapDispatchToPropsParam<TDispatchProps, TOwnProps>
    ): InferableComponentEnhancerWithProps<TStateProps & TDispatchProps, TOwnProps>;

    <TStateProps = {}, TDispatchProps = {}, TOwnProps = {}, TMergedProps = {}>(
        mapStateToProps?: MapStateToPropsParam<TStateProps, TOwnProps, ApplicationState>,
        mapDispatchToProps?: MapDispatchToPropsParam<TDispatchProps, TOwnProps>,
        mergeProps?: MergeProps<TStateProps, TDispatchProps, TOwnProps, TMergedProps>,
        options?: Options<TStateProps, TOwnProps, TMergedProps>
    ): InferableComponentEnhancerWithProps<TMergedProps, TOwnProps>;

}

export const connect = originalConnect as MyConnect;

рдЕрд░реЗ @offbeatful (cc: @pravdomil рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ?), рдореИрдВрдиреЗ рд╣рд╛рд▓ рд╣реА рдореЗрдВ рдЗрд╕ рдореБрджреНрджреЗ рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рдПрдХ рд╕реНрдЯреИрдХ рдУрд╡рд░рдлреНрд▓реЛ рдкреНрд░рд╢реНрди рдкреВрдЫрд╛ рд╣реИ, рдЬрд╣рд╛рдВ рдпрд╣ рдирд┐рд╖реНрдХрд░реНрд╖ рдирд┐рдХрд╛рд▓рд╛ рдЧрдпрд╛ рдерд╛ рдХрд┐ рдпрд╣ рд╡рд░реНрддрдорд╛рди рдореЗрдВ рд╕рдорд░реНрдерд┐рдд рдирд╣реАрдВ рд╣реИред рдЙрд╕ рдкреНрд░рд╢реНрди рдХреЗ рдПрдХ рднрд╛рдЧ рдХреЗ рд░реВрдк рдореЗрдВ рдореИрдВрдиреЗ рдЬреЛ рдкреНрд░рдпрд╛рд╕ рдХрд┐рдпрд╛ рдЙрд╕реЗ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдореИрдВрдиреЗ рдПрдХ рднрдВрдбрд╛рд░ рддреИрдпрд╛рд░ рдХрд┐рдпрд╛ред рдпрд╣ рдирд┐рд╖реНрдХрд░реНрд╖ рдирд┐рдХрд╛рд▓рд╛ рдЧрдпрд╛ рдХрд┐ рдпрд╣ рд╡рд░реНрддрдорд╛рди рдореЗрдВ рд╕рдорд░реНрдерд┐рдд рдирд╣реАрдВ рд╣реИ рдЗрд╕рд▓рд┐рдП рдореИрдВ рдЖрдЬ рдЖрдкрдХрд╛ рдХреЛрдб рд╕реНрдирд┐рдкреЗрдЯ рджреЗрдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдЙрддреНрд╕рд╛рд╣рд┐рдд рдерд╛ рдФрд░ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдкрдиреЗ рднрдВрдбрд╛рд░ рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдЧреЗ рдмрдврд╝рд╛ред

рдпрд╣рд╛рдВ рдЖрдк рдЕрдкрдиреЗ рдХреЛрдб рд╕реНрдирд┐рдкреЗрдЯ рдХреЗ рд╕рд╛рде рдХрдорд┐рдЯрдореЗрдВрдЯ рдХреЛ рдПрдХреАрдХреГрдд рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ

рдпрд╣ рдЕрдм рдЙрди рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЗ рд╕рд╛рде рдирд╣реАрдВ рдЪрд┐рд▓реНрд▓рд╛рддрд╛ рд╣реИ рдЬреЛ рдореБрдЭреЗ рдкрд╣рд▓реЗ рдорд┐рд▓ рд░рд╣реА рдереАрдВ, рд▓реЗрдХрд┐рди рдореИрдВрдиреЗ рдкрд╛рдпрд╛ рд╣реИ рдХрд┐ рдореЗрд░реЗ рдЙрдкрдпреЛрдЧ-рдорд╛рдорд▓реЗ рдореЗрдВ рдЬрд╣рд╛рдВ рдореЗрд░рд╛ рдШрдЯрдХ рдЬреБрдбрд╝рд╛ рд╣реБрдЖ рд╣реИ, рд▓реЗрдХрд┐рди рдЗрд╕рдХрд╛ рдЕрдкрдирд╛ рд╕рд╣рд╛рд░рд╛ рднреА рд╣реИ, рдпрд╣ рдирдпрд╛ рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдЕрдм рдЗрд╕реЗ рдмрдирд╛ рджреЗрдЧрд╛ рддрд╛рдХрд┐ рдпрд╣рд╛рдВ рддрдХ тАЛтАЛтАЛтАЛрдХрд┐ рд░рд╛рдЬреНрдп рдХреЗ рдкреНрд░реЛрдк рдХреА рднреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛ рдЦреБрдж рдХрд╛ (TSX) рд╕рд╣рд╛рд░рд╛ред рдореЗрд░реЗ рднрдВрдбрд╛рд░ рдореЗрдВ cd my-app && yarn start рдореЗрд░рд╛ рдорддрд▓рдм рджрд┐рдЦрд╛рдПрдЧрд╛ред

рдХреНрдпрд╛ рдЖрдкрдХреЛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдХреБрдЫ рдРрд╕рд╛ рд╣реИ рдЬрд┐рд╕реЗ рд╕рдВрдмреЛрдзрд┐рдд рднреА рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдпрд╛ рдпрд╣ рд╕рдВрднрд╡ рдирд╣реАрдВ рд╣реИ?

рдЖрдк рд╕рдВрднрд╡рддрдГ рдЗрд╕ connect рд╕рдВрд╕реНрдХрд░рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣реЗ рд╣реЛрдВрдЧреЗ

connect(
        mapStateToProps: MapStateToPropsParam<TStateProps, TOwnProps, State>,
        mapDispatchToProps: MapDispatchToPropsParam<TDispatchProps, TOwnProps>,
        mergeProps: null | undefined,
        options: Options<State, TStateProps, TOwnProps>
): InferableComponentEnhancerWithProps<TStateProps & TDispatchProps, TOwnProps>

рдпрджрд┐ рдРрд╕рд╛ рд╣реИ, рддреЛ рдЖрдкрдХреЛ options рдкреИрд░рд╛рдореАрдЯрд░ рдХреЛ Options<any, any, any> рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП рдареАрдХ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдЗрд╕ рддрд░рд╣ рдЖрдкрдХреЗ рдкрд╛рд╕ TStateProps & TDispatchProps рд╕рдорд╕реНрдпрд╛ рдирд╣реАрдВ рд╣реЛрдЧреА рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ TStateProps & any

рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ:

const options = { withRef:true } as Options<any, any, any>;
export const Component = connect(mapStateToProps, mapDispatchToProps, null, options)

рдЖрдк рдХреА рддрд░рд╣ рдорд╕реНрдд

@TomasHubelbauer рдмрд╕ рдЕрдкрдиреА рд╡рд┐рдзрд┐ рдХреА рдХреЛрд╢рд┐рд╢ рдХреА, рдЕрдЧрд░ рдЖрдк рдбрд┐рдлрд╝реЙрд▓реНрдЯ redux рдХрдиреЗрдХреНрдЯ рд╡рд┐рдзрд┐ рдкрд░ рд╡рд╛рдкрд╕ рдЬрд╛рддреЗ рд╣реИрдВ
рдпрд╣ рдХрд╛рдлреА рдЕрдЬреАрдм рддрд░рд╣ рд╕реЗ рдХрд╛рдо рдХрд░реЗрдЧрд╛ред

рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдирд╛ рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рд╣реИ рдХрд┐ рдЖрдк рддреАрдиреЛрдВ рдХреЗ рдмреАрдЪ рд╕рд╛рдЭрд╛ рдкреНрд░рдХрд╛рд░реЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ:

export type CounterStateProps = {
    count: number;
};

export type CounterDispatchProps = {
    onIncrement: () => void;
};

export type CounterOwnProps = {
    initialCount: number;
};

export type CounterProps = CounterStateProps & CounterDispatchProps & CounterOwnProps;

рдлрд┐рд░ рд╕реНрдЯреЗрдЯрдлреБрд▓ рдХрдВрдкреЛрдиреЗрдВрдЯ рдХреЛ рд▓рд╛рдЧреВ рдХрд░реЗрдВ

export class StatefulCounter extends React.Component<CounterProps, CounterStateProps> {
    timer: number;

    componentDidMount() {
        this.timer = setInterval(this.props.onIncrement, 5000);
    }

    componentWillUnmount() {
        clearInterval(this.timer);
    }

    render() {
      return (
        <StatelessCounter count={this.props.count}/>
      );
    }
}

рдФрд░ рдЕрдВрдд рдореЗрдВ рдХрдиреЗрдХреНрдЯрд░ рдХреНрд▓рд╛рд╕ рдХреЛ рдРрд╕реЗ рдмрдирд╛рдПрдВ рдЬреИрд╕реЗ рдХрд┐ рдХрдиреЗрдХреНрдЯ рдореЗрдВ рд░реЗрдбрдХреНрд╕ рдХреЗ рдмрд┐рд▓реНрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХрд╕реНрдЯрдо рдХрдиреЗрдХреНрдЯ рдХреЛрдб рдирд╣реАрдВред

const mapStateToProps =
    (state: RootState, ownProps: CounterOwnProps): CounterStateProps => ({
        count: countersSelectors.getReduxCounter(state) + ownProps.initialCount,
    });

const mapDispatchToProps =
    (dispatch: Dispatch<CounterActionType>): CounterDispatchProps => bindActionCreators({
        onIncrement: CounterActions.increment,
    }, dispatch);

export const ConnectedCounter =
    connect(mapStateToProps, mapDispatchToProps)(StatefulCounter);

@ рдЬреЙрдирд╣реИрдВрдбрд▓реА рд╣рд╛рдБ, рдореБрдЭреЗ рдпрд╣ рдХрд╛рдо рдкрддрд╛ рд╣реИ, рдореЗрд░реЗ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ рдореИрдВрдиреЗ рджрд┐рдЦрд╛рдпрд╛ рдХрд┐ рдЗрд╕рд╕реЗ рдкрд╣рд▓реЗ рдХрд┐ рдореИрдВрдиреЗ рдЗрд╕реЗ рд╕рдЬрд╛рд╡рдЯреА рдХреЗ рд░реВрдк рдореЗрдВ рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рд╕реБрдЭрд╛рд╡реЛрдВ рдХреА рдХреЛрд╢рд┐рд╢ рдХреАред рдореИрдВ рдЧреИрд░-рд╕рдЬреНрдЬрд╛рдХрд╛рд░ рд╕рдВрд╕реНрдХрд░рдг рдХрд╛ рд╕рдлрд▓рддрд╛рдкреВрд░реНрд╡рдХ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реВрдВ, рд▓реЗрдХрд┐рди рдореИрдВ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдбреЗрдХреЛрд░реЗрдЯрд░ рдХреЛ рднреА рдПрдХ рдХрд╛рдо рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВред

рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдореИрдВ рдЖрдк рдЕрдкрдиреЗ рдкреНрд░рдХрд╛рд░ рдХреЗ рдорд┐рд╢реНрд░рд┐рдд рд▓рдЧрддрд╛ рд╣реИ, рдЖрдк рдХрд╛ рдЙрдкрдпреЛрдЧ CounterStateProps (рдЬрд┐рдирдореЗрдВ рд╕реЗ рд╡рд╛рдкрд╕реА рдкреНрд░рдХрд╛рд░ рд╣реИ mapDispatchToProps рдХреЗ рдПрдХ рдШрдЯрдХ рдХреЗ рд░реВрдк рдореЗрдВ CounterProps (рдЬреЛ рдареАрдХ рд╣реИ, рдпрд╣ Redux рд░рд╛рдЬреНрдп рд╣реИ рдкреНрд░реЙрдкреНрд╕, рд░реЗрдбрдХреНрд╕ рдбрд┐рд╕реНрдкреИрдЪ рдкреНрд░реЙрдкреНрд╕ рдФрд░ рдЬреЗрдПрд╕рдПрдХреНрд╕ рдХреЗ рдЦреБрдж рдХреЗ рдкреНрд░реЙрдкреНрд╕), рд▓реЗрдХрд┐рди рдХрдВрдкреЛрдиреЗрдВрдЯреНрд╕ рд╕реНрдЯреЗрдЯ рдХреЗ рд▓рд┐рдП рдПрдХ рдкреНрд░рдХрд╛рд░ рдХреЗ рд░реВрдк рдореЗрдВ рднреАред рдЗрд╕рдХреЗ рдмрдЬрд╛рдп state рдЕрдкрдирд╛ рдкреНрд░рдХрд╛рд░ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП рдЬреЛ рдХрд┐рд╕реА рднреА рддрд░рд╣ рд╕реЗ рдмрд╛рд╣рд░реА рдШрдЯрдХ рдХреЗ рдЯрд╛рдЗрдк рд╕рд┐рдЧреНрдиреЗрдЪрд░ рдореЗрдВ рд╢рд╛рдорд┐рд▓ рдирд╣реАрдВ рд╣реИред

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

рдЗрд╕ рдореБрджреНрджреЗ рдкрд░ +1

рдореИрдВрдиреЗ @offbeatful рд╕реЗ рд╕реНрдирд┐рдкреЗрдЯ рдЕрдкрдбреЗрдЯ рдХрд┐рдпрд╛ рд╣реИ рдФрд░ рдЕрдм рдореИрдВ рдЗрд╕рдХрд╛ рд╕рдлрд▓рддрд╛рдкреВрд░реНрд╡рдХ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рд╣реВрдВред

Connect.ts ( IAppState redux рд░рд╛рдЬреНрдп рдХрд╛ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рд╣реИ)

import React from 'react'
import {
    connect as originalConnect,
    MapDispatchToPropsParam,
    MapStateToPropsParam,
    MergeProps,
    Options,
} from 'react-redux'


export type InferableComponentEnhancerWithProps<IInjectedProps, INeedsProps> =
    <IComponent extends React.ComponentType<IInjectedProps & INeedsProps>>(component: IComponent) => IComponent

export interface IConnect {
    <IStateProps = {}, IDispatchProps = {}, IOwnProps = {}>(
        mapStateToProps?: MapStateToPropsParam<IStateProps, IOwnProps, IAppState>,
        mapDispatchToProps?: MapDispatchToPropsParam<IDispatchProps, IOwnProps>,
    ): InferableComponentEnhancerWithProps<IStateProps & IDispatchProps, IOwnProps>

    <IStateProps = {}, IDispatchProps = {}, IOwnProps = {}, IMergedProps = {}>(
        mapStateToProps?: MapStateToPropsParam<IStateProps, IOwnProps, IAppState>,
        mapDispatchToProps?: MapDispatchToPropsParam<IDispatchProps, IOwnProps>,
        mergeProps?: MergeProps<IStateProps, IDispatchProps, IOwnProps, IMergedProps>,
        options?: Options<IStateProps, IOwnProps, IMergedProps>,
    ): InferableComponentEnhancerWithProps<IMergedProps, IOwnProps>

}

export const connect = originalConnect as IConnect

рддрдм рдореЗрд░рд╛ рдЬреБрдбрд╝рд╛ рдШрдЯрдХ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИ:

import {connect} from 'path-to-my-connect/connect'

interface IOwnProps {
    ... props exposed for the real parent component
}

interface IStateProps {
    ... props from mapStateToProps
}

interface IDispatchProps {
    ... props from mapDispatchToProps
}

interface IProps extends IStateProps, IDispatchProps, IOwnProps {}

@connect<IStateProps, IDispatchProps, IOwnProps>(
    (state: IAppState) => {
            return {
                foo: getFoo(state), // getFoo is a selector using 'reselect'
            }
        },
    {setFoo, increment, decrement, ... your action creators},
)
class MyComponent extends React.PureComponent<IProps> {
        // your component implementation
}

export default (MyComponent as any) as React.ComponentType<IOwnProps>

рдбрд╛рдпрд░реЗрдХреНрдЯ рдХрд╛рд╕реНрдЯрд┐рдВрдЧ MyComponent as React.ComponentType<IOwnProps> рд╡рд┐рдлрд▓ рд╣реЛ рдЬрд╛рдПрдЧреА, рдЗрд╕рд▓рд┐рдП рдореИрдВрдиреЗ рдЗрд╕реЗ рдкрд╣рд▓реЗ any рд░реВрдк рдореЗрдВ рдЯрд╛рдЗрдк рдХрд┐рдпрд╛ред рдореБрдЭреЗ рдкрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдПрдХ рд╣реИрдХ рд╣реИ рд▓реЗрдХрд┐рди рдорд╛рддрд╛-рдкрд┐рддрд╛ рдФрд░ рдШрдЯрдХ рдХреЗ рд▓рд┐рдП рднреА рдЕрдЪреНрдЫрд╛ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред

рдпрд╣ рд╕рдмрд╕реЗ рд╡реНрдпрд╡рд╣рд╛рд░реНрдп, рдлрд┐рд░ рднреА рдЕрднреА рднреА рдкреНрд░рддрд┐рдмрдВрдзрд╛рддреНрдордХ рд╕рдорд╛рдзрд╛рди рд╣реИ рдЬрд┐рд╕рдХреЗ рд╕рд╛рде рдореИрдВ рдЖрдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реВрдВред

"react-redux": "^5.0.6",
"typescript": "^2.8.1",
"@types/react-redux": "^6.0.0",

рдХреЛрдИ рдЦрдмрд░?

@ctretyak рдирд╣реАрдВ , рдЖрдкрдХреЛ рдЕрдВрддрддрдГ рдПрдХ рдШреЛрд╖рдгрд╛ рдлрд╝рд╛рдЗрд▓ рд╕реНрд╡рдпрдВ рдмрдирд╛рдиреА рд╣реЛрдЧреА рдФрд░ рдбреЗрдХреЛрд░реЗрдЯрд░ рдХреЛ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд░рд┐рдПрдХреНрдЯ рдЗрдХреЛ рдФрд░ рдЯреАрдПрд╕ рд╕рдмрд╕реЗ рдЕрдЪреНрдЫреЗ рджреЛрд╕реНрдд рдирд╣реАрдВ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рдореИрдВ рдЗрд╕рд╕реЗ рдЖрдЧреЗ рдХреНрдпреЛрдВ рдмрдврд╝рд╛ рд╣реВрдВред

const DecoratedComponent = require('../DecoratedComponent').default;

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

рдпрд╣ рдХреЛрдИ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛-рд░рд┐рдбрдХреНрд╕ рд╕рдорд╕реНрдпрд╛ рдирд╣реАрдВ рд╣реИред рдореЗрд░реЗ рдкрд╛рд╕ @withRouter (рд░рд┐рдПрдХреНрдЯ-рд░рд╛рдЙрдЯрд░ рд╕реЗ) рдФрд░ @graphql рдХреЗ рд╕рд╛рде рд╕рдорд╛рди рд╕рдВрдмрдВрдз рд╣реИ

рдЯрд╛рдЗрдкрдкреНрд░рддрд┐ рд▓рдЧрддрд╛ рд╣реИ рд╕рдордЭ рдореЗрдВ рдирд╣реАрдВ рдЖрддрд╛ рд╣реИ рдХрд┐ рдПрдХ рдбреЗрдХреЛрд░реЗрдЯрд░ рд╕рд╣рд╛рд░рд╛ рдЗрдВрдЬреЗрдХреНрд╖рди рдХрд░ рд╕рдХрддрд╛ рд╣реИ ...

рдЯрд╛рдЗрдкрдкреНрд░рддрд┐ рд▓рдЧрддрд╛ рд╣реИ рд╕рдордЭ рдореЗрдВ рдирд╣реАрдВ рдЖрддрд╛ рд╣реИ рдХрд┐ рдПрдХ рдбреЗрдХреЛрд░реЗрдЯрд░ рд╕рд╣рд╛рд░рд╛ рдЗрдВрдЬреЗрдХреНрд╖рди рдХрд░ рд╕рдХрддрд╛ рд╣реИ ...

рдЙрд╣, рдпрд╣ рдЕрднреА рднреА рдПрдХ рдореБрджреНрджрд╛ рд╣реИ? рдмрд╕ рдЗрд╕реА рдореЗрдВ рднрд╛рдЧ рдЧрдпрд╛ред

рдореБрдЭреЗ рджреБрдЦ рд╣реИ рдХрд┐ рдХреБрдЫ рд╣рдорд╛рд░реЗ рдорд╕реНрддрд┐рд╖реНрдХ рдХреЛ рдирд╖реНрдЯ рдХрд░ рд░рд╣рд╛ рд╣реИ, рд▓реЗрдХрд┐рди рд╡реЗ рд╣рдореЗрдВ рдФрд░ рдЕрдзрд┐рдХ рдЖрд░рд╛рдорджрд╛рдпрдХ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдбрд┐рдЬрд╝рд╛рдЗрди рдХрд┐рдП рдЧрдП рдереЗ :(

рдореБрдЭреЗ рджреБрдЦ рд╣реИ рдХрд┐ рдХреБрдЫ рд╣рдорд╛рд░реЗ рдорд╕реНрддрд┐рд╖реНрдХ рдХреЛ рдирд╖реНрдЯ рдХрд░ рд░рд╣рд╛ рд╣реИ, рд▓реЗрдХрд┐рди рд╡реЗ рд╣рдореЗрдВ рдФрд░ рдЕрдзрд┐рдХ рдЖрд░рд╛рдорджрд╛рдпрдХ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдбрд┐рдЬрд╝рд╛рдЗрди рдХрд┐рдП рдЧрдП рдереЗ :(

рдореИрдВ рднреА :(

рдпрд╣ рд╢рд╛рдпрдж рд╕рднреА рдЙрдкрдпреЛрдЧ рдХреЗ рдорд╛рдорд▓реЛрдВ рдХреЛ рдХрд╡рд░ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ рд▓реЗрдХрд┐рди рдореЗрд░реЗ рд▓рд┐рдП рдЕрдЪреНрдЫрд╛ рдХрд╛рдо рдХрд░ рд░рд╣рд╛ рд╣реИред
рдпрд╣ рдореБрдЭреЗ рдПрдХ рд╣реА рд╕реНрдерд╛рди рдкрд░ рдЕрдкрдирд╛ рд╕реНрдЯреЛрд░ рдкреНрд░рдХрд╛рд░ (MyAppStore) рдЬреЛрдбрд╝рдиреЗ рдХрд╛ рдореМрдХрд╛ рднреА рджреЗрддрд╛ рд╣реИред

export function connectTs<TDispatchProps={}, TOwnProps=any>(
  mapStateToProps?: (state: MyAppStore, ownProps?: TOwnProps) => any,
  mapDispatchToProps?: MapDispatchToPropsParam<TDispatchProps, TOwnProps>
): any {
  return connect(mapStateToProps, mapDispatchToProps)
}

рдХреНрдпрд╛ рдЖрдкрдХреЗ рдкрд╛рд╕ рдХреЛрдИ рдЕрдкрдбреЗрдЯ рд╣реИ?

рдореИрдВ рдбреЗрдХреЛрд░реЗрдЯрд░ рдХреЗ рд░реВрдк рдореЗрдВ рднреА рдХрдиреЗрдХреНрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВред

рдХреЛрдИ рдЖрдзрд┐рдХрд╛рд░рд┐рдХ рд╕рдорд╛рдзрд╛рди рдХреА рдЖрдкреВрд░реНрддрд┐ ???
рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдХрдИ рдбреЗрд╡рд▓рдкрд░реНрд╕ рдХрдиреЗрдХреНрдЯ рдХреЗ рдмрдЬрд╛рдп @connect рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдкрд╕рдВрдж рдХрд░рддреЗ рд╣реИрдВ (mapStateToProps, mapDispatchToProps) (рдШрдЯрдХ)

рдХреНрдпрд╛ рдпрд╣ рдкреГрд╖реНрда рдЙрдкрдпреЛрдЧреА рдерд╛?
0 / 5 - 0 рд░реЗрдЯрд┐рдВрдЧреНрд╕

рд╕рдВрдмрдВрдзрд┐рдд рдореБрджреНрджреЛрдВ

jbreckmckye picture jbreckmckye  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

jgoz picture jgoz  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

Zzzen picture Zzzen  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

[рдбреА3] рдореЙрдбреНрдпреВрд▓ 'рдбреА3-рд╕реНрдХреЗрд▓' рдкрд╣рд▓реЗ рд╣реА 'рдЗрдВрдЯрд░рдкреЛрд▓реЗрдЯрдХреВрд▓' рдирд╛рдо рдХреЗ рдПрдХ рд╕рджрд╕реНрдп рдХреЛ рдирд┐рд░реНрдпрд╛рдд рдХрд░ рдЪреБрдХрд╛ рд╣реИред рдЕрд╕реНрдкрд╖реНрдЯрддрд╛ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдкреБрдирдГ рдирд┐рд░реНрдпрд╛рдд рдХрд░рдиреЗ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВред
matt-senseye picture matt-senseye  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

tyv picture tyv  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ