Typescript React/Redux:“typeof MyClass”类型的参数不可分配给“ComponentType<...”类型的参数

Posted

技术标签:

【中文标题】Typescript React/Redux:“typeof MyClass”类型的参数不可分配给“ComponentType<...”类型的参数【英文标题】:Typescript React/Redux : Argument of type 'typeof MyClass' is not assignable to parameter of type 'ComponentType<...' 【发布时间】:2018-05-15 14:00:08 【问题描述】:

我是 Redux 的新手,也是 Typescript 的新手。

我在the react-redux docs 中找到了一个相当不错的基本精简版。

代码是这样的:

import * as actionCreators from '../actions/index'
import  bindActionCreators  from 'redux'
import React,  Component  from 'react'
import  connect  from 'react-redux'

class TodoApp extends Component 
    render() 
        return (<div>test!</div>)
    

function mapStateToProps(state) 
  return  todos: state.todos 


function mapDispatchToProps(dispatch) 
  return  actions: bindActionCreators(actionCreators, dispatch) 



export default connect(mapStateToProps, mapDispatchToProps)(TodoApp)

我的代码编辑器(带有 TSLint 扩展的 VS 代码)和 tsc 都将最后的 (TodoApp) 突出显示为错误,这是我得到的消息:

src/components/test.tsx(20,61): 错误 TS2345: 类型参数 'typeof TodoApp' 不可分配给 'ComponentType

20 导出默认连接(mapStateToProps, mapDispatchToProps)(TodoApp)

我的问题是我并不完全了解 mapStateToPropsconnect 正在做什么,但在了解之前,我想知道是否有代码更改我可以在这里修复这个 Typescript “错误”。

【问题讨论】:

【参考方案1】:

您的反应组件不需要任何道具,因此您的 connect 有一个错误,因为它推断 mapStateToPropsmapDispatchToProps 都应该返回空对象

你可以通过为 react 属性添加类型定义来解决这个问题,但是隐式 any 的使用也有很多不安全的情况。如果为了安全起见,您要完全键入此应用程序,它将看起来像这样......

interface ITodo 
  description: string


interface ITodosState 
  todos: ITodo[]


interface ITodoProps 
  todos: ITodo[]


interface ITodoActionProps 
  someAction: () => void


class TodoApp extends React.Component<ITodoProps & ITodoActionProps> 
    render() 
        return (<div>test!</div>)
    


function mapStateToProps(state: ITodosState): ITodoProps 
  return  todos: state.todos 


function mapDispatchToProps(dispatch: Dispatch<ITodosState>): ITodoActionProps 
  return bindActionCreators( someAction: actionCreators.someAction , dispatch)


export default connect<ITodoProps, ITodoActionProps, >(mapStateToProps, mapDispatchToProps)(TodoApp)

【讨论】:

我的实际工作示例与我上面发布的不太一样,我的解决方案实际上是将interface ITodoActionProps someAction: () =&gt; void 更改为interface ITodoActionProps someAction: typeof actionCreators.someAction 您的出色回答立即说明了这一点-谢谢!跨度> 【参考方案2】:

你还没有输入TodoApp的道具。

type Props = 
    todos: any[] // What ever the type of state.todos is
    actions: 
       addTodo: Dispatch<any>
    


class TodoApp extends React.Component<Props> 
    render() 
        return <div>test!</div>
  

【讨论】:

以上是关于Typescript React/Redux:“typeof MyClass”类型的参数不可分配给“ComponentType<...”类型的参数的主要内容,如果未能解决你的问题,请参考以下文章

将 React Redux 连接到 Typescript 中的组件

简单用 React+Redux+TypeScript 实现一个 TodoApp

Springboot + mybatis + React+redux+React-router+antd+Typescript: React+Typescrip项目的搭建

Springboot + mybatis + React+redux+React-router+antd+Typescript: 上线

TypeScript + React + Redux 实战简单天气APP全套完整项目

Typescript React/Redux:“typeof MyClass”类型的参数不可分配给“ComponentType<...”类型的参数