рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛-рд░реЗрдбрдХреНрд╕ рдХреЗ 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 рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ рдорджрдж рдХрд░ рд╕рдХрддрд╛ рд╣реИ: рдбреЗрдХреЛрд░реЗрдЯрд░ рд╕рдВрднрд╛рд╡рд┐рдд рд░реВрдк рд╕реЗ рдЬреЗрдирд░реЗрдЯ рдХрд┐рдП рдЧрдП рдШрдЯрдХ рдХреЗ рд▓рд┐рдП рдкреНрд░реЛрдк рдХрд╛ рдПрдХ рд╡реИрдХрд▓реНрдкрд┐рдХ рд╕рдВрд╕реНрдХрд░рдг рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рд▓рд┐рдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдЬреЛ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЖрджрд░реНрд╢ рдирд╣реАрдВ рд╣реИ рд▓реЗрдХрд┐рди рдЖрдкрдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЛ рдкреНрд░реЛрдк рдирд▓рд┐рдЯреА рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЕрдзрд┐рдХ рдореБрдЦрд░ рд╣реЛрдиреЗ рджреЗрдирд╛ рдЬрд╛рд░реА рд░рдЦрддрд╛ рд╣реИред
рдореИрдВ рджреВрд╕рд░реЗ рджрд┐рди рдЗрд╕реА рддрд░рд╣ рдХреЗ рдореБрджреНрджреЛрдВ рдкрд░ рдерд╛ рдФрд░ рдЗрд╕реЗ рдХрдиреЗрдХреНрдЯ рдлрдВрдХ рдХреЗ рд▓рд┐рдП рдЫреЛрдбрд╝ рджрд┐рдпрд╛ред рдкреНрд░рдХрд╛рд░ рдмрдВрдж рджрд┐рдЦрддреЗ рд╣реИрдВ рдФрд░ рдкреБрд░рд╛рдиреЗ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдкреНрд░рдХрд╛рд░реЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред рдореИрдВ рдЗрд╕реЗ рдареАрдХ рдХрд░рдиреЗ рдФрд░ рдкреАрдЖрд░ рдЬрдорд╛ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВ?
рдмреЗрд╢рдХ! рдЗрди рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЛ рдореВрд▓ рд░реВрдк рд╕реЗ рд▓рд┐рдЦреЗ рдЬрд╛рдиреЗ рдХреЗ рдмрд╛рдж рд╕реЗ рдмрд╣реБрдд рдХреБрдЫ рдмрджрд▓ рдЧрдпрд╛ рд╣реИ, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдореБрдЭреЗ рдЕрднреА рднреА рд╕рдВрджреЗрд╣ рд╣реИ рдХрд┐ рдЙрддреНрдкрд░рд┐рд╡рд░реНрддрди-рд╕рдЬреНрдЬрд╛рдХрд╛рд░ рд╕рдорд░реНрдерди рдХреЗ рдмрд┐рдирд╛ рдХреБрдЫ рдЙрдкрдпреЛрдЧреА рд╕рдВрднрд╡ рд╣реИред рд▓реЗрдХрд┐рди рдореИрдВрдиреЗ рдкрд╣рд▓реЗ рдЯрд╛рдЗрдк рд╕рд┐рд╕реНрдЯрдо рдореЗрдВ рдЕрдиреНрдп рдЕрдкрд░реНрдпрд╛рдкреНрддрддрд╛рдУрдВ рдХреЗ рдЖрд╕рдкрд╛рд╕ рдХрд╛рдо рдХрд┐рдпрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЗрд╕реЗ рдПрдХ рд╢реЙрдЯ рджреЗрдВред
рд╢рд╛рдпрдж рдореИрдк рдХрд┐рдП рдЧрдП рдкреНрд░рдХрд╛рд░ рдЖрдкрдХреЛ рд╡рд╣рд╛рдВ рдХреЗ рд░рд╛рд╕реНрддреЗ рдХрд╛ рд╣рд┐рд╕реНрд╕рд╛ рдорд┐рд▓ рд╕рдХрддреЗ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рдХрдо рд╕реЗ рдХрдо рдЖрдкрдХреЗ рдкрд╛рд╕ рдЖрдЙрдЯрдкреБрдЯ рдореЗрдВ _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) (рдШрдЯрдХ)
рд╕рдмрд╕реЗ рдЙрдкрдпреЛрдЧреА рдЯрд┐рдкреНрдкрдгреА
рд╕реАрдзреЗ
@connect
рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП (рдЗрд╕рд▓рд┐рдП рдХрд╕реНрдЯрдо рдбреЗрдХреЛрд░реЗрдЯрд░реНрд╕ рдХреЛ рдкреЗрд╢ рдХрд┐рдП рдмрд┐рдирд╛) рдореИрдВ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╡рд░реНрдХрдЕрд░рд╛рдЙрдВрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реВрдВ:рд▓реЗрдХрд┐рди рдореИрдВ @seansfkelley рд╕реЗ рдкреВрд░реА рддрд░рд╣ рд╕рд╣рдордд