@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
рдореБрдЭреЗ рдпрд╣ рддреНрд░реБрдЯрд┐ рднреА рдорд┐рд▓ рд░рд╣реА рд╣реИред рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЯрд╛рдЗрдкрдкреАрдл рдореЗрдВ рд╕реЗ рдПрдХ рдиреЗ рдЧрд▓рддреА рд╕реЗ 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<{}>' рдЕрд╕рд╛рдЗрди рдХрд░рдиреЗ рдпреЛрдЧреНрдп рдирд╣реАрдВ рд╣реИред
рдкреНрд░рдХрд╛рд░ 'рдХреЗрд╡рд▓ рдкрдврд╝рдиреЗ рдХреЗ рд▓рд┐рдП<{}>' рдореЗрдВ 'рдХреЗрд╡рд▓ рдкрдврд╝рдиреЗ рдХреЗ рд▓рд┐рдП' рдкреНрд░рдХрд╛рд░ рдХреЗ рдирд┐рдореНрди рдЧреБрдг рдореМрдЬреВрдж рдирд╣реАрдВ рд╣реИрдВ
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"
}
}
рд╕рдмрд╕реЗ рдЙрдкрдпреЛрдЧреА рдЯрд┐рдкреНрдкрдгреА
рдЯрд╛рдЗрдкрдкреНрд░рддрд┐ 3.0.1 рдореЗрдВ рдлрд┐рд░ рд╕реЗ рдЯреВрдЯ рдЬрд╛рддрд╛ рд╣реИред рд╣рд╛рдп рдерд┐рдПрди!