我有这个容器
export interface State {
email: string
}
const mapStateToProps = (state: State) => ({
email: state.email,
})
const mapDispatchToProps = (dispatch: Dispatch<Action>) => ({
onChange: (name: string, value: string) => dispatch(/*...*/),
})
export default connect(mapStateToProps, mapDispatchToProps)(Login)
和这个组件
export interface LoginProps {
email: string
onChange: (name: string, value: string) => void
}
const Login = (props: LoginProps) => (
<p>Render something here</p>
)
有没有办法根据Container
定义推断登录属性的类型,所以我不必手动定义LoginProps
?
答案 0 :(得分:1)
connect
有很好的类型定义,因此可以推断传递给包装组件的props的类型。如果您像这样编写容器/组件......
export interface State {
email: string
}
const stateToProps = (state: State) => ({
email: state.email
})
const dispatchToProps = (dispatch: Dispatch<Action>) => ({
onChange: (name: string, value: string) => dispatch(/*...*/)
})
const BlahBlah = connect(stateToProps, dispatchToProps)(({ email, onChange }) => (
<div />
));
email
和onChange
无需额外注释即可正确输入。
但是,当您单独编写Login
组件时,没有类型注释...
const Login = (props) => (
<p>Render something here</p>
)
无法推断出props
的类型。这是因为除了将Login
传递给connect
之外,您还可以直接调用它。例如,我可以写一个组件:
render() {
return (
<Login unrelated="a string" typescript="cool" />
);
}
在Login组件上没有注释,编译器无法知道Login
(连接的一个或我的直接渲染)的哪些调用提供了正确的道具。如果没有注释,编译器只能输入道具any
,因此我们失去了类型安全性。