Definitelytyped: рдХрдиреЗрдХреНрдЯ () рдХреЗ рд╕рд╛рде рд╕рдорд╕реНрдпрд╛ @ рдкреНрд░рдХрд╛рд░/рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛-рд░реЗрдбрдХреНрд╕ рдореЗрдВ 4.4.41 рдореЗрдВ рдкреЗрд╢ рдХреА рдЧрдИ

рдХреЛ рдирд┐рд░реНрдорд┐рдд 6 рдЬреВрди 2017  ┬╖  44рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ  ┬╖  рд╕реНрд░реЛрдд: DefinitelyTyped/DefinitelyTyped

@types/react-redux рд╕рдВрд╕реНрдХрд░рдг 4.4.40 рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП, рдирд┐рдореНрди рдХреЛрдб

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

interface State {
    y: number;
}

// Own properties
interface OP {
    x: number;
}

// State properties
interface SP {
    y: number;
}

function mapStateToProps(state: State, ownProps: OP): OP & SP {
    return {
        x: ownProps.x,
        y: state.y,
    };
}

class TestComp extends React.Component<OP & SP, null> {
    render() {
        return <p>Hello</p>;
    }
}

export default connect(mapStateToProps)(TestComp);

рдореБрдЭреЗ рдЗрд╕ рдкреНрд░рдХрд╛рд░ TestComp рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рджреЗрдЧрд╛:

const tc = <TestComp x={42}/>;

рд╕рдВрд╕реНрдХрд░рдг 4.4.41 рдФрд░ 4.4.42 рдХреЗ рд╕рд╛рде рдЙрдкрд░реЛрдХреНрдд рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╕рдВрдХрд▓рди рддреНрд░реБрдЯрд┐ рдХреА рдУрд░ рдЬрд╛рддрд╛ рд╣реИ:

error TS2324: Property 'y' is missing in type 'IntrinsicAttributes & IntrinsicClassAttributes<Component<OP & SP, ComponentState>> & { children?:...'.

/cc @thasner @seansfkelley @tkqubo @blakeembrey @sandersn @mhegazy @andy-ms @hans-permana

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

рдЯрд╛рдЗрдкрдкреНрд░рддрд┐ 3.0.1 рдореЗрдВ рдлрд┐рд░ рд╕реЗ рдЯреВрдЯ рдЬрд╛рддрд╛ рд╣реИред рд╣рд╛рдп рдерд┐рдПрди!

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

рдореБрдЭреЗ рдпрд╣ рддреНрд░реБрдЯрд┐ рднреА рдорд┐рд▓ рд░рд╣реА рд╣реИред рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЯрд╛рдЗрдкрдкреАрдл рдореЗрдВ рд╕реЗ рдПрдХ рдиреЗ рдЧрд▓рддреА рд╕реЗ TOwnProps рдФрд░ TMergedProps / TStateProps рдХреЛ рдмрджрд▓ рджрд┐рдпрд╛, рд▓реЗрдХрд┐рди рдореИрдВрдиреЗ рдХреЗрд╡рд▓ index.d.ts рдкрд░ рдПрдХ рд╕рд░рд╕рд░реА рдирдЬрд░ рдбрд╛рд▓реАред

рдЗрд╕ рдореБрджреНрджреЗ рдкрд░ рдХреЛрдИ рдЕрдкрдбреЗрдЯ? рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд░реЗрдбрдХреНрд╕ + рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдореЗрдВ рдЖрдиреЗ рд╡рд╛рд▓реЗ рдирдП рдбреЗрд╡рд▓рдкрд░ рдХреЗ рд▓рд┐рдП рдпрд╣ рд╢реЛрд╕реНрдЯреЙрдкрд░ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рдЖрдкрдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рдХрд╛рдо рдзрдиреНрдпрд╡рд╛рджред

@brauliodiez рдореИрдВрдиреЗ @blakeembrey рдХреЗ рдлрд┐рдХреНрд╕ # 16969 рдХреЛ рдорд┐рд▓рд╛ рджрд┐рдпрд╛ред рдпрд╣ рдПрдХ-рдПрдХ рдШрдВрдЯреЗ рдореЗрдВ рдЙрдкрд▓рдмреНрдз рд╣реЛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред рдореБрдЭреЗ рдмрддрд╛рдПрдВ рдХрд┐ рдХреНрдпрд╛ рдЗрд╕рд╕реЗ рд▓рд╛рдн рд╣реЛрддрд╛ рд╣реИред

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╣рдо рдЕрднреА рднреА рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХреЛ https://github.com/DefinitelyTyped/DefinitelyTyped/pull/16969 рдХреЗ рд╕реБрдзрд╛рд░реЛрдВ рдХреЗ рд╕рд╛рде рднреА рджреЗрдЦ рд░рд╣реЗ рд╣реИрдВред рдпрд╣рд╛рдБ рдПрдХ рдбрдореА рдШрдЯрдХ рд╣реИ рдЬрд┐рд╕реЗ рдореИрдВрдиреЗ рдЗрд╕ рдореБрджреНрджреЗ рдХреЛ рдЖрдЬрд╝рдорд╛рдиреЗ рдФрд░ рдЕрд▓рдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрдирд╛рдпрд╛ рд╣реИ:

import * as React from "react"
import { connect, MapStateToProps, MapDispatchToPropsFunction } from "react-redux"


interface RootState {
  globalA: string
  globalB: number
}

interface DumbComponentProps {
  a: string
  b: number
  c?: number
}

const DumbComponent = (props: DumbComponentProps): JSX.Element => {
  return (
    <div>Something: {props.a} {props.b} {props.c}</div>
  )
}

type ConnectedStateProps = Pick<DumbComponentProps, "a" | "b">
type ConnectedOwnProps = Pick<DumbComponentProps, "c">

const mapStateToProps: MapStateToProps<ConnectedStateProps, ConnectedOwnProps> = (
    state: RootState): ConnectedStateProps => {
  return {
    a: state.globalA,
    b: state.globalB
  }
}

const SmartComponent = connect(
  mapStateToProps
)(DumbComponent)

export default SmartComponent

рдореИрдВ рдлрд┐рд░ рдХрд╣реАрдВ рд╕реНрдорд╛рд░реНрдЯрдХрдВрдкреЛрдиреЗрдВрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реВрдВ рдФрд░ рд╕реА рдореЗрдВ рдкрд╛рд╕ рдХрд░рддрд╛ рд╣реВрдВ (рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдП рдФрд░ рдмреА рд░рд╛рдЬреНрдп рд╕реЗ рдЖрдиреЗ рд╡рд╛рд▓реЗ рд╣реИрдВ)ред

...
return (
  <SmartComponent c{2} />
)

рдореБрдЭреЗ рдЬреЛ рддреНрд░реБрдЯрд┐ рдорд┐рд▓рддреА рд╣реИ рд╡рд╣ рд╣реИ:

error TS2322: Type '{ c: 2; }' is not assignable to type 'IntrinsicAttributes & IntrinsicClassAttributes<Component<DumbComponentProps, ComponentState>> & R...'.
  Type '{ c: 2; }' is not assignable to type 'Readonly<DumbComponentProps>'.
    Property 'a' is missing in type '{ c: 2; }'.

рд╡реАрдПрд╕ рдХреЛрдб рдореЗрдВ рдкреНрд░рдХрд╛рд░реЛрдВ рдХрд╛ рдирд┐рд░реАрдХреНрд╖рдг рдХрд░рддреЗ рд╣реБрдП, рдореИрдВрдиреЗ рджреЗрдЦрд╛ рдХрд┐ рдпрд╣ рд╕реНрдорд╛рд░реНрдЯрдХрдВрдкреЛрдиреЗрдВрдЯ рдХреЗ рд▓рд┐рдП рдЧрд▓рдд рдкреНрд░рдХрд╛рд░ рдЙрдард╛ рд░рд╣рд╛ рд╣реИред рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ React.ComponentClass<DumbComponentProps> рд╣реИ ... рд▓реЗрдХрд┐рди рдпрд╣ React.ComponentClass<Pick<DumbComponentProps, "c">> рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП (рдпрд╛рдиреА, рдЗрд╕реЗ рдХреЗрд╡рд▓ рдУрдирдкреНрд░реЙрдкреНрд╕ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред рдпрд╣ рдкреНрд░рдХрд╛рд░реЛрдВ рд╕реЗ рд╕рдордЭ рдореЗрдВ рдЖрддрд╛ рд╣реИ, рдЬрд╣рд╛рдВ рдХрдВрдкреЛрдиреЗрдВрдЯрдбреЗрдХреЛрд░реЗрдЯрд░ рдПрдХ рдлрд╝рдВрдХреНрд╢рди рд╣реИ рдЬреЛ ComponentClass<T> рджреЗрддрд╛ рд╣реИ T extends TOwnProps ) ... рдЗрд╕рд▓рд┐рдП рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ рдореБрдЭреЗ рдирд╣реАрдВ рдкрддрд╛ рдХрд┐ рдпрд╣ рд╕рд╣реА рддрд░реАрдХреЗ рд╕реЗ рдореИрдкрд┐рдВрдЧ рдХреНрдпреЛрдВ рдирд╣реАрдВ рдХрд░ рд░рд╣рд╛ рд╣реИред

рдХреНрдпрд╛ рдореИрдВ рдпрд╣рд╛рдБ рдХреБрдЫ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдЧрд▓рдд рдХрд░ рд░рд╣рд╛ рд╣реВрдБ? рдХреНрдпрд╛ рд╕рдВрдХрд▓рдХ рдХреЛ рдореБрдЭреЗ рдЪрд░рдг рджрд░ рдЪрд░рдг рджрд┐рдЦрд╛рдиреЗ рдХрд╛ рдХреЛрдИ рддрд░реАрдХрд╛ рд╣реИ рдЬреЛ рд╡рд╣ рдмрддрд╛ рд░рд╣рд╛ рд╣реИ?

рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ mapDistpachToProps рдЕрдм рд╡реИрдХрд▓реНрдкрд┐рдХ рдирд╣реАрдВ рд╣реИред рдХреНрдпрд╛ рдпрд╣ рдареАрдХ рд╣реИ рдпрд╛ рдмрдЧ рд╣реИ?

рдКрдкрд░ рдореЗрд░реА рдЯрд┐рдкреНрдкрдгреА рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрджреНрдпрддрди, рдереЛрдбрд╝рд╛ рдЦреЛрджрдиреЗ рдХреЗ рдмрд╛рдж - рдореИрдВрдиреЗ рдПрдХ рдкрд░реАрдХреНрд╖рдг рдХреЗрд╕ рдмрдирд╛рдпрд╛ рд╣реИ рдЬреЛ рд╡рд░реНрддрдорд╛рди рдореЗрдВ рд╡рд┐рдлрд▓ рд░рд╣рддрд╛ рд╣реИ (рд▓реЗрдХрд┐рди рдореБрдЭреЗ рд╡рд┐рд╢реНрд╡рд╛рд╕ рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП) рдФрд░ рдЯрд╛рдЗрдкрд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рдПрдХ рдлрд┐рдХреНрд╕ рдЬреЛ рдореЗрд░реЗ рдорд╛рдорд▓реЗ рдХреЛ рд╕рдВрднрд╛рд▓рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЙрд╕ рдорд╛рдорд▓реЗ рдХреЛ рд╕рдВрднрд╛рд▓ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ рдЬрд╣рд╛рдВ рдпрд╣ рдЕрдиреБрдорд╛рди рд▓рдЧрд╛рдирд╛ рд╣реИ рдХрд┐ рдУрдирдкреНрд░реЙрдкреНрд╕ рдХреНрдпрд╛ рд╣реИрдВ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП connect()(DumbComponent) )ред рдореЗрд░рд╛ рдкрд░рд┐рд╡рд░реНрддрди рдпрд╣рд╛рдБ рд╣реИ:
https://github.com/DefinitelyTyped/DefinitelyTyped/compare/master...ritwik :react-redux/fix-ownprop-inference
рдЗрд╕реЗ рд╣рд▓ рдХрд░рдиреЗ рдореЗрдВ рдорджрдж рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рд▓реЗрдХрд┐рди рдореИрдВ рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЗ рд╕рд╛рде рдЕрдкрдиреЗ рдЬреНрдЮрд╛рди рдХреА рд╕реАрдорд╛рдУрдВ рдХреЛ рдорд╛рд░ рд░рд╣рд╛ рд╣реВрдВред рдЕрдЧрд░ рдХрд┐рд╕реА рдХреЗ рдкрд╛рд╕ рдореЗрд░реЗ рдЯреЗрд╕реНрдЯ рдХреЗрд╕ рдпрд╛ рд╕реБрдЭрд╛рд╡реЛрдВ рдкрд░ рд╡рд┐рдЪрд╛рд░ рд╣реИ, рддреЛ рдЙрди рдкрд░ рдЪрд░реНрдЪрд╛ рдХрд░рдирд╛ рдЕрдЪреНрдЫрд╛ рд▓рдЧреЗрдЧрд╛ред

рдмрд╕ рдпрд╣рд╛рдВ рд▓реВрдк рдмрдВрдж рдХрд░рдирд╛ - https://github.com/DefinitelyTyped/DefinitelyTyped/pull/17196 рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рд╣рдорд╛рд░реЗ рдХреЛрдбрдмреЗрд╕ рдХреЗ рд▓рд┐рдП рдЗрд╕реЗ рдареАрдХ рдХрд░рддрд╛ рд╣реИред

рдХреНрдпрд╛ рдпрд╣ рд╣рд▓ рд╣реЛ рдЧрдпрд╛? рдореБрдЭреЗ рд╡рд░реНрддрдорд╛рди рдореЗрдВ ^5.0.8 ( IntrinsicAttributes & IntrinsicClassAttributes<Component<Pick ... ) рдореЗрдВ рдпрд╣ рд╕рдорд╕реНрдпрд╛ рд╣реЛ рд░рд╣реА рд╣реИред рдЕрдВрддрд░ рдХреЗрд╡рд▓ рдЗрддрдирд╛ рд╣реИ рдХрд┐ рдореИрдВ interfaces рдХреЗ рдмрдЬрд╛рдп interfaces types рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рд╣реВрдВред

рдХрд┐рд╕реА рдХреЛ? рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ рдпрд╣ рдореЗрд░реЗ рд▓рд┐рдП рдПрдХ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд╢реЛрд╕реНрдЯреЙрдкрд░ рд╣реИ...

@proProbe рдХреНрдпрд╛ рдЖрдк рдЕрдкрдирд╛ @types/react-redux , @types/react , рдФрд░ redux рд╕рдВрд╕реНрдХрд░рдг, рдФрд░ рдПрдХ рдирдореВрдирд╛ рдкреНрд░рджрд╛рди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЬреЛ рддреНрд░реБрдЯрд┐ рдХреЛ рдкреБрди: рдЙрддреНрдкрдиреНрди рдХрд░рддрд╛ рд╣реИ?
рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛ рд╕реАрд╕реА рдкреИрдХреЗрдЬ рд▓реЗрдЦрдХ: @tkqubo @thasner @kenzierocks @clayne11 @tansongyang @nicholasboll

рджреЗрд░ рд╕реЗ рдЙрддреНрддрд░ рдХреЗ рд▓рд┐рдП рдХреНрд╖рдорд╛ рдХрд░реЗрдВ! рдореИрдВ рдЗрд╕реЗ рдкреБрди: рдкреЗрд╢ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдирдореВрдиреЗ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░ рд░рд╣рд╛ рдерд╛ред рддрдм рдореБрдЭреЗ рдЕрдЪрд╛рдирдХ рдПрд╣рд╕рд╛рд╕ рд╣реБрдЖ рдХрд┐ рдЗрд╕реЗ @types/react-redux: "^5.0.8" рдореЗрдВ рдареАрдХ рдХрд░ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рд╣рд╛рд▓рд╛рдВрдХрд┐ рдзрдиреНрдпрд╡рд╛рдж!

рдЕрднреА рднреА рдЗрд╕реЗ "^ 5.0.10" рдХреЗ рд╕рд╛рде рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ :(

"@types/react": "^15.6.4",
"redux": "3.7.2",
"@types/react-redux": "^5.0.10"

рдореИрдВ рдПрдХ рдкреИрдХреЗрдЬ рд▓реЗрдЦрдХ рдХреЗ рд╕рд╛рде рдПрдХ рдХреЛрдб рд╕реНрдирд┐рдкреЗрдЯ рд╕рд╛рдЭрд╛ рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВ рд▓реЗрдХрд┐рди рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рд░реВрдк рд╕реЗ рдирд╣реАрдВред

рдЬреИрд╕рд╛ рдХрд┐ рдКрдкрд░ рд╕реБрдЭрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ, 4.4.40 рдкрд░ рдбрд╛рдЙрдирдЧреНрд░реЗрдб рдХрд░рдиреЗ рд╕реЗ рддреНрд░реБрдЯрд┐ рддреБрд░рдВрдд рджреВрд░ рд╣реЛ рдЬрд╛рддреА рд╣реИред

рдореИрдВ mapStateToProps рдХреЗ рд░рд┐рдЯрд░реНрди рд╡реИрд▓реНрдпреВ рдХреЗ рдкреНрд░рдХрд╛рд░ рдкрд░ рдЯрд╛рдЗрдк-рдкреИрд░рд╛рдореАрдЯрд░рд╛рдЗрдЬрд┐рдВрдЧ рдХрдиреЗрдХреНрдЯ рджреНрд╡рд╛рд░рд╛ рдЕрдкрдиреЗ рдХреЛрдб рдмреЗрд╕ рдореЗрдВ рдЗрд╕реЗ рд╣рд▓ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рдерд╛ рдФрд░ рдЬреЛ рдореИрдВ рдЦреБрдж рдЪрд╛рд╣рддрд╛ рдерд╛ред рдЕрдЧрд░ рдореИрдВ рдЙрддреНрдкрд╛рдж рдЖрдИрдбреА рдХреА рд╕реВрдЪреА рдХреЗ рд╕рд╛рде рдЕрдкрдиреА рдЙрддреНрдкрд╛рдж рд╕реВрдЪреА рдХреЛ рдХреЙрд▓ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рддреЛ рд╕рдВрджрд░реНрдн рд╕реЗ рдмрд╛рд╣рд░ рд▓реЗ рдЬрд╛рдпрд╛ рдЧрдпрд╛:

<ProductList productIDs={productIDs} />

рдФрд░ рд╕реВрдЪреА рдореЗрдВ рджрд┐рдЦрд╛рдП рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ рдЙрддреНрдкрд╛рджреЛрдВ рдореЗрдВ рдЙрди рдЖрдИрдбреА рдХрд╛ рдЕрдиреБрд╡рд╛рдж рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП mapStateToProps рд╣реИ рдЬреИрд╕реЗ:

const mapStateToProps = (state: RootState, ownProps: {productIDs: List<UUID>}) => {
  return { products: state.get('products').filter(
    (p: Product) => ownProps.productIDs.contains(p.uuid)) };
};

рддреЛ рдореБрдЭреЗ connect рдЬреИрд╕реЗ рдкреИрд░рд╛рдореАрдЯрд░ рдмрдирд╛рдирд╛ рдкрдбрд╝рд╛:

const ProductList = connect<ProductListProps, void, {productIDs: List<UUID>}>(mapStateToProps)(ProductListComponent);

рдХреБрдЫ рдЬрд╛рдВрдЪ рдХреЗ рдмрд╛рджред рдореБрдЭреЗ рдПрдХ рд╕рд░рд▓ рдЙрдкрд╛рдп рдорд┐рд▓рд╛ред рдЖрдкрдХреЛ рдмрд╕ рдЗрддрдирд╛ рдХрд░рдирд╛ рд╣реИ рдХрд┐ "compilerOptions": { "рд╕рдЦреНрдд": true } рдЖрдкрдХреЗ tsconfig.json рдореЗрдВ рд╣реИ рдпрджрд┐ рдЖрдк рдПрдХ React.Component<,> рдХрдВрдкреЛрдиреЗрдВрдЯ рдХрдиреЗрдХреНрдЯ рдХрд░ рд░рд╣реЗ рд╣реИрдВред

рдЯрд╛рдЗрдкрдкреНрд░рддрд┐ 2.8.x рдЗрд╕реЗ рдареАрдХ рдХрд░рддрд╛ рд╣реИред рдЕрдкрдЧреНрд░реЗрдб рдХрд░реЗрдВ рдФрд░ рдЗрд╕реЗ рдЖрдЬрдорд╛рдПрдВред

рдЯрд╛рдЗрдкрдкреНрд░рддрд┐ 3.0.1 рдореЗрдВ рдлрд┐рд░ рд╕реЗ рдЯреВрдЯ рдЬрд╛рддрд╛ рд╣реИред рд╣рд╛рдп рдерд┐рдПрди!

рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ 3.2.2 рдХреЗ рд╕рд╛рде рднреА рддреЛрдбрд╝рдирд╛ред

рдХреНрдпрд╛ рдЗрд╕ рдореБрджреНрджреЗ рдореЗрдВ рдХреЛрдИ рдЕрдкрдбреЗрдЯ рд╣реИ?

рдореЗрд░реЗ рд▓рд┐рдП рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ 3.2.2 рдХреЗ рд╕рд╛рде рднреА рдЯреВрдЯ рдЧрдпрд╛ред рд╣рд╛рд▓рд╛рдВрдХрд┐, connect рдХреЗ рд╕рд╛рде connect<Props> рдХреА рд╡реНрдпрд╛рдЦреНрдпрд╛ рдХрд░рдирд╛ рдЗрд╕реЗ рдареАрдХ рдХрд░рддрд╛ рдкреНрд░рддреАрдд рд╣реЛрддрд╛ рд╣реИред

рдореЗрд░реЗ рдкрд╛рд╕ рдПрдХ рд╣реА рд╕рдорд╕реНрдпрд╛ рд╣реИ, рдпрд╣рд╛рдВ рддрдХ тАЛтАЛтАЛтАЛрдХрд┐ рдПрдиреЛрдЯреЗрдЯрд┐рдВрдЧ рдХрдиреЗрдХреНрдЯ рдХреЗ рд╕рд╛рде рднреА: /

рдореЗрд░реЗ рдкрд╛рд╕ рднреА рдпрд╣реА рд╕рдорд╕реНрдпрд╛ рд╣реИ, рдХреЛрдИ рдЕрдкрдбреЗрдЯ рдмрд┐рд▓реНрдХреБрд▓ рдирд╣реАрдВ?

рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ 3.2.4 рдХреЗ рд╕рд╛рде рднреА рддреЛрдбрд╝рдирд╛ред

рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдЬрд▓реНрдж рд╣реА рд╕реБрд▓рдЭрдиреЗ рд╡рд╛рд▓рд╛ рдирд╣реАрдВ рд╣реИред

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

рдпрд╣ рдХрд╛рдо рдХрд░ рд░рд╣рд╛ рд╣реИред

рдХреНрдпрд╛ рд╕реНрдерд╛рдиреАрдп рд╕реНрддрд░ рдкрд░ рдЗрд╕ рддреНрд░реБрдЯрд┐ рдХреЛ рдХрдо рд╕реЗ рдХрдо рдЪреБрдк рдХрд░рд╛рдиреЗ рдХрд╛ рдХреЛрдИ рд╕рдорд╛рдзрд╛рди рд╣реИ?

рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдУрдирдкреНрд░реЙрдкреНрд╕ рдмрдирд╛рдо рд╕реНрдЯреЗрдЯрдкреНрд░реЙрдкреНрд╕ рдореЗрдВ рдХрд╣реАрдВ рди рдХрд╣реАрдВ рдПрдХ рдлреНрд▓рд┐рдк рдлреНрд▓реЙрдк рд╣реИред рдореИрдВ рдЗрд╕ рдореБрджреНрджреЗ рдХреЛ рджреЗрдЦ рд░рд╣рд╛ рд╣реВрдВ рдЬрд╣рд╛рдВ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ Redux рдХрдиреЗрдХреНрдЯреЗрдб рдХрдВрдкреЛрдиреЗрдВрдЯ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдмрдЪреНрдЪреЗ рд╣реИрдВред

рдЗрд╕ рдореБрджреНрджреЗ рдХреЛ рд╢рд╛рдВрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдореИрдВрдиреЗ рдХреЗрд╡рд▓ <any> рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рд╣реИ:

export default connect<any>(states, actions)(SomeComponent);

рдпрджрд┐ рдЖрдк рд▓рд┐рдЦреЗрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ рддреЛ рднреА рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ:

export default compose<any>(
  connect(states, actions),
  withStyles(styles)
)(SomeFunctionalComponent);

рдпрд╣ 'рд╕реНрдорд╛рд░реНрдЯ'/рдХрдиреЗрдХреНрдЯреЗрдб рдХрдВрдкреЛрдиреЗрдВрдЯ рдХреЗ рд▓рд┐рдП рдкреНрд░реЙрдкреНрд╕ рдкрд╛рд╕ рдХрд░рддреЗ рд╕рдордп рддреНрд░реБрдЯрд┐ рдХреЛ рд╢рд╛рдВрдд рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред

рд╕рдВрдкрд╛рджрд┐рдд рдХрд░реЗрдВ: рдореИрдВ рдмрд╕ рдлрд┐рд░ рд╕реЗ рдзрд╛рдЧреЗ рдХреЛ рдлрд┐рд░ рд╕реЗ рдкрдврд╝рддрд╛ рд╣реВрдВ, рдФрд░ рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ @the рдЖрдзреБрдирд┐рдХ рд▓рд╛рдЗрдл рдХрд╛ рд╡рд░реНрдХрдЕрд░рд╛рдЙрдВрдб рдмреЗрд╣рддрд░ рд╡рд░реНрдХрдЕрд░рд╛рдЙрдВрдб рд╣реИ (рдпрд╛рдиреА рдкреНрд░реЙрдкреНрд╕ рдЗрдВрдЯрд░рдлреЗрд╕ рдпрд╛ рдЯрд╛рдЗрдк рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдПрдиреЛрдЯреЗрдЯ рдХрдиреЗрдХреНрдЯ рдпрд╛ рдХрдВрдкреЛрдЬ рдХрд░реЗрдВ):

рдХреНрдпрд╛ рдпрд╣ рд╕рднреА рдкреНрд░рдХрд╛рд░ рдХреА рдЬрд╛рдВрдЪ рдФрд░ рдЗрдВрдЯреЗрд▓рд┐рдЬреЗрдВрд╕ рдХреЛ рднреА рдирд╖реНрдЯ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ? рддреЛ рдлрд┐рд░ рдЯрд╛рдЗрдкрд┐рдВрдЧ рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдХрд╛ рдХреНрдпрд╛ рдорддрд▓рдм рд╣реИ? @dcefram

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

рдореИрдВ рднреА, рдЗрд╕рдХреЗ рд▓рд┐рдП рдлрд┐рдХреНрд╕ рдХрд╛ рдЗрдВрддрдЬрд╛рд░ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ :)

рдЗрд╕ рддрд░рд╣ рд╕реЗ connect рдХреЙрд▓ рдХреЛ рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ рдЯрд╛рдЗрдк рдХрд░рдирд╛ рдмреЗрд╣рддрд░ рд╕рдорд╛рдзрд╛рди рд╣реИ:

type StateProps = {
  // Attributes that you want mapped from redux store
}
type DispatchProps = {
  // Dispatch actions
}
type OwnProps = {
  // Other props that component expects when being created
}
type Props = StateProps & DispatchProps & OwnProps;
class ExampleComponent extends React.Component<Props> { /* ... */ }

const mapStateToProps = (state: State, ownProps: OwnProps): StateProps => { /* .. */ }
const mapDispatchToProps = (dispatch: Dispatch): DispatchProps => { /* ... */ }

export default connect<StateProps, DispatchProps, OwnProps>
  (mapStateToProps, mapDispatchToProps)(ExampleComponent)

рдпрд╣ рд╕рд╣реА рдХрдиреЗрдХреНрдЯреЗрдб рдШрдЯрдХ рдмрдирд╛рдирд╛ рдЪрд╛рд╣рд┐рдП рдЬреЛ OwnProps рдмрдирд╛рдП рдЬрд╛рдиреЗ рдХреА рдЕрдкреЗрдХреНрд╖рд╛ рдХрд░рддрд╛ рд╣реИ рдФрд░ рдХреЛрдИ рдЕрдиреНрдп рд░рд╛рдЬреНрдп рдирд╣реАрдВ рд╣реИ рдФрд░ рди рд╣реА рдкреНрд░реЗрд╖рдг рдкреНрд░реЛрдкред

рдирдХрд╛рд░рд╛рддреНрдордХред рдпрд╣ рдЕрднреА рднреА рдкреНрд░рдХрд╛рд░реЛрдВ рдХрд╛ рдЕрдиреБрдорд╛рди рд▓рдЧрд╛рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░ рд░рд╣рд╛ рд╣реИред рдЗрд╕рдХреЗ рдмрдЬрд╛рдп рдореБрдЭреЗ рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ const рдЯрд╛рдЗрдк рдХрд░рдирд╛ рд╣реЛрдЧрд╛ рдФрд░ рдлрд┐рд░ рдЙрд╕реЗ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдХреЗ рд░реВрдк рдореЗрдВ рд╡рд╛рдкрд╕ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред

const connected: React.ComponentType<OwnProps> = connect<StateProps, DispatchProps, OwnProps>(......)(Component);
export default connected;

"@ рдкреНрд░рдХрд╛рд░/рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛-рд░реЗрдбрдХреНрд╕": "7.0.1" рдФрд░ "рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ": "3.4.5" рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХрдиреЗрдХреНрдЯ() рдХреЗ рд╕рд╛рде рдПрдХ рд╣реА рд╕рдорд╕реНрдпрд╛ рдХрд╛ рд╕рд╛рдордирд╛ рдХрд░рдирд╛ рдкрдбрд╝ рд░рд╣рд╛ рд╣реИред рдЙрд▓реНрд▓рд┐рдЦрд┐рдд рдХреЛрдИ рд╕рдорд╛рдзрд╛рди рдорджрдж рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред @TroySchmidt рдХреНрдпрд╛ рдЖрдк рд╕рд╛рдЭрд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдЖрдкрдиреЗ рдореВрд▓ рдШрдЯрдХ рдореЗрдВ рдЗрд╕ "рдХрдиреЗрдХреНрдЯреЗрдб" рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреИрд╕реЗ рдХрд┐рдпрд╛ рд╣реИ рдпрджрд┐ рд╕рдВрднрд╡ рд╣реЛ рддреЛ рдХреБрдЫ рдирдореВрдирд╛ рдХреЛрдб рдмрд╣реБрдд рдЙрдкрдпреЛрдЧреА рд╣реЛрдВрдЧреЗ

рд╣рд╛рдп, рдореБрдЭреЗ рдПрдХ рд╣реА рддреНрд░реБрдЯрд┐ рдереАред рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛-рд░реЗрдбрдХреНрд╕ mapStateToProps рдХреЗ рд╡рд╛рдкрд╕реА рдореВрд▓реНрдп рдХреЛ "TIInjectedProps" рдХреЗ рд░реВрдк рдореЗрдВ рд╣рд▓ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рдЬреЛ Omit рд╕рд╣рд╛рдпрдХ @types/react-redux index.d.ts:110 export type InferableComponentEnhancerWithProps рдореЗрдВ рдЧрд▓рдд рдмрд╣рд┐рд╖реНрдХрд░рдг рдХрд╛ рдХрд╛рд░рдг рдмрдирддрд╛ рд╣реИред

рдХрдиреЗрдХреНрдЯ рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ рдкреНрд░рдХрд╛рд░ рдХреА рдкрд░рд┐рднрд╛рд╖рд╛ рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд░рддреА рд╣реИ

// connect Redux
export const RCHeader = connect
<IHeaderStateToProps, //returned by mapStateToProps
 {}, // not necessary
 IHeaderProps, // props you want to pass through jsx/tsx
 IHeaderConnectedReduxStateProps, // combined from IHeaderMapStateToProps and IHeaderProps
 {}// not necessary
>(
    (state: ISettingsState ): IHeaderStateToProps => {
        return {
            headerLogoURL: state.settings.headerLogoURL
        }
    },
    undefined,
    undefined,
    { forwardRef: true }
)(Header);
{
  "dependencies": {
    "react": "^16.8.6",
    "react-redux": "^6.0.1",
    "redux": "^4.0.1"
  },
  "devDependencies": {
    "@types/react": "^16.8.17",
    "@types/react-redux": "^7.0.6",
    "react-scripts-ts": "^4.0.8",
    "typescript": "^3.4.5"
  }
}

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

рд╣рд╛рд▓ рд╣реА рдореЗрдВ, рдореИрдВ рдПрдХ рдШрдЯрдХ рд▓рд┐рдЦрддрд╛ рд╣реВрдВ рдЬреЛ connect рдХреЛ redux рдореЗрдВ рдмрджрд▓ рджреЗрдЧрд╛ред рдЬрдм рдореИрдВ рдЗрд╕ рдШрдЯрдХ рдХреЛ рджреВрд╕рд░реА рдЬрдЧрд╣ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реВрдВ, рддреЛ рдЗрд╕рдХреЗ рд╕рднреА рдкреНрд░реЙрдкреНрд╕ рдЧрд╛рдпрдм рд╣реЛрддреЗ рд╣реИрдВред рдФрд░ рдЗрд╕реЗ рдареАрдХ рдХрд░реЗрдВ:

type StateProps = {
  /* some code */
};

type DispatchProps = {
  /* some code */
};

type OwnProps = {
  /* some code */
};

type Props = StateProps & DispatchProps & OwnProps;

const mapStateToProps = (state: IReduxState): StateProps => ({
  /* some code */
});

const mapDispatchToProps = (dispath: Dispatch<AnyAction>): DispatchProps => {
  /* some code */
};

const BaseComponent: React.FC<Props> = (props: Props) => {
  /* some code */
};

export const ConnectedComponent: React.ComponentType<OwnProps> = connect<
  StateProps,
  DispatchProps,
  OwnProps,
  IReduxState
>(
  mapStateToProps,
  mapDispatchToProps
)(BaseComponent);

рдирд┐рд░реНрднрд░рддрд╛ рдиреАрдЪреЗ рд╣реИрдВ:

{
  "dependencies": {
    "react": "^16.8.6",
    "react-dom": "^16.8.6",
    "react-redux": "^7.1.0",
    "redux": "^4.0.1",
  },
  "devDependencies": {
    "@types/react": "^16.8.22",
    "@types/react-dom": "^16.8.4",
    "@types/react-redux": "^7.1.0",
    "@types/redux": "^3.6.0",
    "typescript": "^3.5.2"
  }
}

рдХреБрдЫ рдмреБрдирд┐рдпрд╛рджреА рдкреНрд░рдХрд╛рд░ рдХреЗ рдЕрдиреБрдорд╛рди рдХреЗ рдмрдЬрд╛рдп рдЙрди рд╕рднреА рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЛ рдЬреЛрдбрд╝рдирд╛ рдореЗрд░реЗ рд▓рд┐рдП рдПрдХ рдЕрдЪреНрдЫрд╛ рд╕рдорд╛рдзрд╛рди рдирд╣реАрдВ рд▓рдЧрддрд╛ рд╣реИ ...

рдпрд╣ рдЕрднреА рднреА рдПрдХ рдореБрджреНрджрд╛ рдХреА рддрд░рд╣ рд▓рдЧрддрд╛ рд╣реИред рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рд╕рдорд╕реНрдпрд╛ 7.0.2 рд╕рдВрд╕реНрдХрд░рдг рдореЗрдВ рдкреЗрд╢ рдХреА рдЧрдИ рдереА, рдХреНрдпреЛрдВрдХрд┐ рдореИрдВ 7.0.1 рд╕реНрдерд╛рдкрд┐рдд рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВ рдФрд░ рдЕрдиреБрдорд╛рди рд╕рд╣реА рдврдВрдЧ рд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред

рдореЗрд░реЗ рд▓рд┐рдпреЗ рдХрд╛рд░реНрдп рдХрд░рддрд╛ рд╣реИред
@justemit рдиреЗ рд╕рд╣реА рджреГрд╖реНрдЯрд┐рдХреЛрдг рдкреЛрд╕реНрдЯ рдХрд┐рдпрд╛ рдЬреЛ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдФрд░ рд░рд┐рдбрдХреНрд╕ рдХреЗ рдЕрдВрддрд┐рдо рд╕рдВрд╕реНрдХрд░рдгреЛрдВ рдкрд░ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред

@justemit рдзрдиреНрдпрд╡рд╛рдж, рдЗрд╕рдиреЗ рдореБрдЭреЗ рдкрд╛рдЧрд▓ рдХрд░ рджрд┐рдпрд╛

рд╕рдВрдкрд╛рджрд┐рдд рдХрд░реЗрдВ: рдореИрдВрдиреЗ React.FC<Props> . рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╕рдорд╕реНрдпрд╛ рдХреЛ рдареАрдХ рдХрд░ рджрд┐рдпрд╛ рд╣реИ

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдореБрджреНрджрд╛ рдЕрднреА рднреА рдЬреАрд╡рд┐рдд рд╣реИ рдФрд░ @types/react-redux@^7.1.2 рдореЗрдВ рдареАрдХ рд╣реИ:

const propTypes = {
  foo: PropTypes.number.isRequired,
  bar: PropTypes.func.isRequired
};

// inferring the Props type
interface Props extends PropTypes.InferProps<typeof propTypes> {}
// although doing it explicitly also yields the same result
interface Props {
  foo: number,
  bar: (...args: any[]) => any
}

const Foo = (props : Props) => <></> // EDIT: incorrect way to define functional components
const Foo : React.FC<Props> = (props) => <></> // EDIT: the correct way
//          ^^^^^^^^

Foo.propTypes = propTypes;
/* Foo.defaultProps = {
  foo: 1,
  bar: () => {}
} //*/

const mapStateToProps = (state : any) => ({
  foo: 1
})
const mapDispatchToProps = {
  bar: () => {}
}
const Bar = connect(mapStateToProps, mapDispatchToProps)(Foo)

const Baz = () => <Bar /> // throws an error
Type '{}' is missing the following properties from type 'Readonly<Pick<Pick<Props, never>, never> & Pick<InferProps<{ foo: Validator<number>; bar: Validator<(...args: any[]) => any>; }>, "foo" | "bar">>': foo, bar



md5-e744aa0bac3ac7f45f015259c5597ea9



рдЯрд╛рдЗрдк рдХрд░реЗрдВ 'ConnectedComponentClass<...>' рдЯрд╛рдЗрдк рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП 'ComponentType<{}>' рдЕрд╕рд╛рдЗрди рдХрд░рдиреЗ рдпреЛрдЧреНрдп рдирд╣реАрдВ рд╣реИред
рдкреНрд░рдХрд╛рд░ 'рдХреЗрд╡рд▓ рдкрдврд╝рдиреЗ рдХреЗ рд▓рд┐рдП<{}>' рдореЗрдВ 'рдХреЗрд╡рд▓ рдкрдврд╝рдиреЗ рдХреЗ рд▓рд┐рдП' рдкреНрд░рдХрд╛рд░ рдХреЗ рдирд┐рдореНрди рдЧреБрдг рдореМрдЬреВрдж рдирд╣реАрдВ рд╣реИрдВ; рдмрд╛рд░: рд╕рддреНрдпрд╛рдкрдирдХрд░реНрддрд╛<(...args: рдХреЛрдИ []) => рдХреЛрдИ рднреА>; }>>': рдлреВ, рдмрд╛рд░

And even if typing everything explicitly helped, I agree with <strong i="16">@alexandrudanpop</strong> that it should be possible to infer those types instead of doing everything manually ЁЯдФ 

**Edit:** for anyone looking for inspiration for a workaround, I currently resort to explicitly casting using `unknown`:
```ts
// assumes `mapDispatchToProps` is an object, could be a function if used with `ReturnType`
type OwnProps = Omit<Props, keyof ReturnType<typeof mapStateToProps> | keyof mapDispatchToProps>
connect(mapStateToProps, mapDispatchToProps)(Foo) as unknown as React.ComponentType<OwnProps>

рдХреБрдЫ рдРрд╕рд╛ рдЬреЛ рдЕрдиреБрдорд╛рди рдореЗрдВ рдорджрдж рдХрд░ рд╕рдХрддрд╛ рд╣реИ (рдЕрднреА рднреА рдХреБрдЫ рдореИрдиреБрдЕрд▓ рдХрд╛рдо рд╣реИ) рдРрд╕рд╛ рдХреБрдЫ рдХрд░ рд░рд╣рд╛ рд╣реИ
@kdmadej рдЙрджрд╛рд╣рд░рдг рд╕реЗ рд╣рдЯрдХрд░

type StateProps = ReturnType<typeof mapStateToProps>;
type DispatchProps = typeof mapDispatchToProps;
type OwnProps = {
  a: string;
  b: number;
}

type Props = StateProps & DispatchProps & OwnProps;

const Foo = (props : Props) => <></>

const mapStateToProps = (state : any) => ({
  foo: 1
})

const mapDispatchToProps = {
  bar: () => {}
}

export default connect(mapStateToProps, mapDispatchToProps)(Foo)


// In another file
const Baz = () => <Bar /> <-- this should throw error expecting `a` and `b`

рд╣рд╛рд▓рд╛рдБрдХрд┐, рдореБрдЭреЗ рдЬрд┐рд╕ рд╕рдорд╕реНрдпрд╛ рдХрд╛ рд╕рд╛рдордирд╛ рдХрд░рдирд╛ рдкрдбрд╝ рд░рд╣рд╛ рд╣реИ, рд╡рд╣ рдпрд╣ рд╣реИ рдХрд┐ рдЬрдм рдореИрдВ рдорд┐рд╢реНрд░рдг рдореЗрдВ OwnProps рдЬреЛрдбрд╝рддрд╛ рд╣реВрдБред рдХрд╣реАрдВ рднреА <Bar /> рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╕реЗ рдкреНрд░реЛрдк a рдФрд░ b рд▓рд╛рдкрддрд╛ рд╣реЛрдиреЗ рдХреЗ рдХрд╛рд░рдг рдПрдХ рддреНрд░реБрдЯрд┐ рдлреЗрдВрдХрдиреА рдЪрд╛рд╣рд┐рдП, рд▓реЗрдХрд┐рди рдРрд╕рд╛ рдирд╣реАрдВ рд╣реИ, рдФрд░ рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдореБрдЭреЗ рдкрд░реЗрд╢рд╛рди рдХрд░ рд░рд╣рд╛ рд╣реИ (рдХреЛрдИ рдЗрд░рд╛рджрд╛ рдирд╣реАрдВ рд╣реИ)ред

рдореИрдВ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЗрд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд░ рдЪреБрдХрд╛ рд╣реВрдВ

const ConnectedBar: React.ComponentType<OwnProps> = connect(mapStateToProps, mapDispatchToProps)(Bar);
export default ConnectedBar;

рдпрд╛ рд╕рдордХрдХреНрд╖

export default connect(mapStateToProps, mapDispatchToProps)(Foo) as React.ComponentType<OwnProps>;

рдореИрдВрдиреЗ рдлрд╝рдВрдХреНрд╢рди рдШрдЯрдХ рдХреЛ рдареАрдХ рд╕реЗ рдЯрд╛рдЗрдк рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП React.FC<Props> рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЕрдкрдиреЗ рдореБрджреНрджреЛрдВ рдХреЛ рдареАрдХ рдХрд░ рд▓рд┐рдпрд╛ рд╣реИ
рдореВрд▓ рдкреЛрд╕реНрдЯ рдЕрдкрдбреЗрдЯ рдХрд┐рдпрд╛ рдЧрдпрд╛

рдЗрд╕ рдкрд░ рдХреЛрдИ рдЕрдкрдбреЗрдЯ? рдЬреИрд╕рд╛ рдХрд┐ @alexandrudanpop рдиреЗ рдХрд╣рд╛, рдХреБрдЫ рдмреБрдирд┐рдпрд╛рджреА рдкреНрд░рдХрд╛рд░ рдХреЗ рдЕрдиреБрдорд╛рди рдХреЗ рдмрдЬрд╛рдп рдЙрди рд╕рднреА рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЛ рдЬреЛрдбрд╝рдирд╛ рдПрдХ рдЕрдЪреНрдЫрд╛ рд╕рдорд╛рдзрд╛рди рдирд╣реАрдВ рд▓рдЧрддрд╛ рд╣реИред рдореИрдВ 7.2.1 рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ рдФрд░ рдореБрдЭреЗ рдЕрднреА рднреА рд╡рд╣реА рд╕рдорд╕реНрдпрд╛ рд╣реИред

рдореЗрд░реЗ рдЕрдиреНрдп рдШрдЯрдХреЛрдВ рдореЗрдВ рдореЗрд░реЗ рдкрд╛рд╕ рд╣реИ:

const connector = connect(mapStateToProps, mapDispatchToProps);
type PropsFromRedux = ConnectedProps<typeof connector>;
type Props = PropsFromRedux & OwnProps;

рд▓реЗрдХрд┐рди рдпрд╣ рдХрд╛рдо рдирд╣реАрдВ рдХрд░ рд░рд╣рд╛ рд╣реИ рдЕрдЧрд░ рдорд╛рддрд╛-рдкрд┐рддрд╛ рдХреБрдЫ рдкреНрд░реЛрдк рднреА рднреЗрдЬ рд░рд╣реЗ рд╣реИрдВред

рд╕рд╛рде рд╣реА рдПрдХ рд╣реА рд╕рдорд╕реНрдпрд╛ рдХрд╛ рдЕрдиреБрднрд╡ рдХрд░ рд░рд╣реЗ рд╣реИрдВред
рдПрдирдкреАрдПрдо рдЕрдкрдбреЗрдЯ рдХреЗ рдмрд╛рдж рдмреНрд░реЗрдХ рд▓рдЧрд╛рдирд╛ рд╢реБрд░реВ рдХрд┐рдпрд╛ред
рдореЗрд░рд╛ рдлрд┐рдХреНрд╕ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рд╣реИ:
export default connect(mapStateToProps)(ConnectedIntlProvider) as unknown as ComponentType<unknown>;
рдЕрдЬреНрдЮрд╛рдд рдХреЗ рд░реВрдк рдореЗрдВ рдХреНрдпреЛрдВрдХрд┐ рдХреЛрдИ рдУрдирдкреНрд░реЙрдкреНрд╕ рдирд╣реАрдВ рд╣реИред рдХреЗрд╡рд▓ рдУрдирдкреНрд░реЙрдк рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред

рд╣рд╛рд▓рд╛рдВрдХрд┐, рдЗрд╕ рддрд░рд╣ рдпрд╣ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ:
export default connect<StateFromProps, null, OwnProps, ApplicationState>(mapStateToProps)(viewWithIntl);

рд▓реЗрдХрд┐рди рдЗрд╕ рддрд░рд╣ рдпрд╣ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ:
export default connect<StateFromProps, DispatchFromProps, OwnProps, ApplicationState>( mapStateToProps, mapDispatchToProps, )(attachmentFormWithIntel)
рдФрд░ рдЗрд╕рдХреЗ рд▓рд┐рдП рдкреНрд░рддреНрдпрдп рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ:
as unknown as ComponentType<OwnProps>;

рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП
"@ рдкреНрд░рдХрд╛рд░/рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛": "16.9.49",
"@ рдкреНрд░рдХрд╛рд░/рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛-рд░реЗрдбрдХреНрд╕": "^ 7.1.9",
"рдЯрд╛рдЗрдкрдкреНрд░рддрд┐": "^4.0.3"
"рд░реЗрдбрдХреНрд╕": "^4.0.5",
{
"рдирд┐рд░реНрднрд░рддрд╛": {
"рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛": "^16.13.1",
"рд░рд┐рдПрдХреНрд╢рди-рдбреЛрдо": "^16.13.1",
"рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛-рд░рд┐рдбрдХреНрд╕": "^ 7.2.1",
"рд░реЗрдбрдХреНрд╕": "^4.0.5",
},
"рджреЗрд╡ рдирд┐рд░реНрднрд░рддрд╛": {
"@ рдкреНрд░рдХрд╛рд░/рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛": "16.9.49"
"@ рдкреНрд░рдХрд╛рд░/рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛-рдбреЛрдо": "16.9.8",
"@ рдкреНрд░рдХрд╛рд░/рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛-рд░реЗрдбрдХреНрд╕": "^ 7.1.9",
"рдЯрд╛рдЗрдкрдкреНрд░рддрд┐": "^4.0.3"
}
}

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

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

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

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

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

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

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