You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

能否基于容器组件自动推断Login组件的Props类型?

当然可以自动推断组件Props类型!

在TypeScript环境下,我们完全不需要手动定义LoginProps——可以借助TypeScript的内置类型工具,或者Redux提供的专属类型,直接从mapStateToProps和mapDispatchToProps的定义自动推导出组件所需的Props类型。这样既能减少重复代码,还能避免手动维护类型导致的不一致问题。

方法一:用TypeScript内置的ReturnType组合类型

这种方式不需要额外依赖,纯用TS自带的类型工具就能实现:

首先保留你的容器逻辑,然后提取两个map函数的返回值类型并组合:

import { Dispatch } from 'redux';
import { connect } from 'react-redux';

export interface State { email: string }
// 假设你的Action类型已定义
type Action = { type: 'SET_EMAIL'; payload: string };

// 原mapState和mapDispatch定义不变
const mapStateToProps = (state: State) => ({ 
  email: state.email, 
})

const mapDispatchToProps = (dispatch: Dispatch<Action>) => ({ 
  onChange: (name: string, value: string) => dispatch({ type: 'SET_EMAIL', payload: value }), 
})

// 自动提取两个map函数返回的props类型
type MapStateProps = ReturnType<typeof mapStateToProps>;
type MapDispatchProps = ReturnType<typeof mapDispatchToProps>;

// 组合成组件的Props类型
type LoginProps = MapStateProps & MapDispatchProps;

// 组件直接使用自动推导的LoginProps
const Login = (props: LoginProps) => ( 
  <p>Render something here</p> 
)

export default connect(mapStateToProps, mapDispatchToProps)(Login);

方法二:用Redux的ConnectedProps类型(更简洁)

如果你的@types/react-redux版本在v7.1及以上,可以用官方提供的ConnectedProps类型,直接从connect的连接器中提取组件Props:

import { Dispatch } from 'redux';
import { connect, ConnectedProps } from 'react-redux';

export interface State { email: string }
type Action = { type: 'SET_EMAIL'; payload: string };

const mapStateToProps = (state: State) => ({ 
  email: state.email, 
})

const mapDispatchToProps = (dispatch: Dispatch<Action>) => ({ 
  onChange: (name: string, value: string) => dispatch({ type: 'SET_EMAIL', payload: value }), 
})

// 先创建连接器
const connector = connect(mapStateToProps, mapDispatchToProps);
// 自动提取组件所需的Props类型
type LoginProps = ConnectedProps<typeof connector>;

// 组件使用该类型
const Login = (props: LoginProps) => ( 
  <p>Render something here</p> 
)

// 导出连接后的组件
export default connector(Login);

为什么这么做更好?

  • 减少重复代码:不用手动编写和维护LoginProps,避免重复定义相同的属性
  • 类型一致性:只要mapStateToProps或mapDispatchToProps的返回值发生变化,组件的Props类型会自动同步更新,不会出现类型不匹配的问题
  • 更直观:组件的Props来源完全由容器逻辑决定,逻辑和类型绑定更紧密

内容的提问来源于stack exchange,提问作者ThomasThiebaud

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 04:31:50