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

Redux Todo示例(TypeScript版)AddTodo.tsx的dispatch隐式any类型问题

这个问题我熟!TypeScript在严格类型检查模式下,会对没有明确类型的变量抛出隐式any的错误,这里的dispatch就是因为没指定类型才触发报错的。下面给你几种靠谱的解决办法:

方法一:给组件Props定义明确的类型

先从Redux导入Dispatch类型,再给组件接收的props定义接口,把dispatch的类型明确下来:

import * as React from 'react'
import { connect, Dispatch } from 'react-redux'
import { addTodo } from '../actions'

// 定义组件的props类型
interface AddTodoProps {
  dispatch: Dispatch
}

const AddTodo = ({ dispatch }: AddTodoProps) => {
  // 把input的类型从any改成更严谨的HTMLInputElement | null
  let input: HTMLInputElement | null = null
  return (
    <div>
      <form onSubmit={e => {
        e.preventDefault()
        if (!input?.value.trim()) {
          return
        }
        dispatch(addTodo(input.value))
        input.value = ''
      }}>
        <input ref={el => input = el} />
        <button type="submit">Add Todo</button>
      </form>
    </div>
  )
}

export default connect()(AddTodo)

方法二:使用useDispatch钩子(推荐,更简洁)

如果你的React-Redux版本在v7.1.0以上,推荐用函数组件的useDispatch钩子,它会自动推断dispatch的类型,完全不用手动定义:

import * as React from 'react'
import { useDispatch } from 'react-redux'
import { addTodo } from '../actions'

const AddTodo = () => {
  const dispatch = useDispatch()
  let input: HTMLInputElement | null = null
  
  return (
    <div>
      <form onSubmit={e => {
        e.preventDefault()
        if (!input?.value.trim()) {
          return
        }
        dispatch(addTodo(input.value))
        input.value = ''
      }}>
        <input ref={el => input = el} />
        <button type="submit">Add Todo</button>
      </form>
    </div>
  )
}

export default AddTodo

这种方式不用再用connect包裹组件,代码更清爽,类型也自动处理到位了。

方法三:给connect指定泛型参数

如果你还是想用connect,可以通过泛型参数明确state和dispatch的类型,让connect自动注入正确类型的props:

import * as React from 'react'
import { connect } from 'react-redux'
import { addTodo } from '../actions'
import { RootState } from '../store' // 假设你已经定义了RootState全局状态类型

const AddTodo = ({ dispatch }) => {
  let input: HTMLInputElement | null = null
  return (
    <div>
      <form onSubmit={e => {
        e.preventDefault()
        if (!input?.value.trim()) {
          return
        }
        dispatch(addTodo(input.value))
        input.value = ''
      }}>
        <input ref={el => input = el} />
        <button type="submit">Add Todo</button>
      </form>
    </div>
  )
}

// 泛型参数依次是:组件映射的state、ownProps、dispatchProps、全局RootState
export default connect<{}, {}, {}, RootState>(() => ({}))(AddTodo)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 11:28:23