当前位置: 首页 > 面试题库 >

将Typescript与React-Redux一起使用时出现类型错误

宣熙云
2023-03-14
问题内容

我正在尝试将React-redux与Typescript一起使用,当我尝试使用connect()和mapStateToProps注入道具时遇到类型错误。

我的组件如下所示:

function mapStateToProps(state) {
    return {
        counter: state.counter
    };
}

function mapDispatchToProps(dispatch) {
    return {
        incr: () => {
            dispatch({type: 'INCR', by: 2});
        },
        decr: () => {
            dispatch({type: 'INCR', by: -1});
        }
    };
}




export default class Counter extends React.Component<HelloProps, any> {
    render() {
        return (
          <div>
              <p>
                  <label>Counter: </label>
                  <b>#{this.props.counter}</b>
              </p>
              <button onClick={e => this.props.incr() }>INCREMENT</button>
              <span style={{ padding: "0 5px" }}/>
              <button onClick={e => this.props.decr() }>DECREMENT</button>
        );
    }
}


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

商店看起来像这样

let store = createStore(
    (state:HelloState, action:HelloAction) => {
        switch (action.type) {
            case 'INCR':
                return {counter: state.counter + action.by};
            default:
                return state;
        }
    },

最后,我将类型定义为:

interface HelloProps {
    counter?: number;
    incr?: () => any;
    decr?: () => any;
}

interface HelloState { 
    counter:number;
}

interface HelloAction { 
    type:string, 
    by:number;
}

当我尝试编译代码时,出现以下错误:

(39,61): error TS2345: Argument of type 'typeof Counter' is not assignable to parameter of type 'ComponentClass<{ counter: any; } & { incr: () => void; decr: () => void; }> | StatelessComponent<...'.
  Type 'typeof Counter' is not assignable to type 'StatelessComponent<{ counter: any; } & { incr: () => void; decr: () => void; }>'.
    Type 'typeof Counter' provides no match for the signature '(props?: { counter: any; } & { incr: () => void; decr: () => void; }, context?: any): ReactElement<any>'

有趣的是,即使代码抛出类型错误,它仍然可以正常工作。同样,将组件的prop接口更改为any也可以解决该问题。似乎类型系统无法理解这两个映射功能将两个对象合并在一起。


问题答案:

我在有关Github
问题的倒数第二篇文章中找到了答案。如果mapStateToPropsand和/或mapDispatchToPropsor
上都没有type参数connect则会产生两个map函数的返回类型的交集。



 类似资料:
  • 我有一个通过http承载图像的地理服务器。我的客户端站点使用https。我一直在使用openlayers,一切都很好。现在我正试图转移到cesiumjs,我在IE或Edge中没有得到任何图像(不幸的是,我无法测试其他浏览器)。如果使用bing地图,我可以在我的客户机中获取图像,因此客户机代码在其他情况下是可用的。在浏览器控制台中,我看到: SEC7117:网络请求超文本传输协议://[myserv

  • 在嵌入式TomEE容器中运行Arquillian测试时,我得到了以下错误

  • 我试图映射到道具的行动,但我得到一个错误:类型错误:_this2.props.updateUsername不是一个函数 如何成功地将redux操作映射到props并成功调用函数?我在任何其他stackoverflow问题/答案中都没有看到这个错误弹出,这是一个简单的错误吗?会不会是在. index或. app中对redux的设置错误? 我试过:-不使用默认导出导入-有不同格式的mapDispatc

  • 问题内容: 使用React Router v4开发React应用程序。一切顺利,直到我在应用程序中引入了Redux。从那时起,单击更改路径的链接时,浏览器url发生更改,但是未加载与该路径相对应的组件。如果我注释掉Redux代码,它会很好地工作。是什么原因造成的?这是我的路由代码: PS:控制台没有错误。代码运行干净,只是组件没有加载。这是github上的类似线程:4671。我在各种站点上看到了很

  • 问题内容: 给定以下使用泛型类型参数的类型化React组件,我该如何将其包装在React的新API中? 上面的方法无法定义泛型。 问题答案: 因此,为了扩大问题范围,这实际上是关于在更高阶函数中保留泛型类型的问题。的以下用法将正确类型检查(在中) 但是,泛型会立即解析为,而不是保留为泛型。因此,以下内容不会进行类型检查 在此Typescript发行凭单中跟踪了相关的发行。

  • 我是Typscript 2的新手。我想做的是在typescript中使用jQuery。在这个问题中,我读到你需要两件事: 这将安装包“@types/jquery 2.0.39”。 然后,在打字稿文件中,我把这个: 但是我收到打字稿错误“找不到模块'jquery'。我做错了什么? 与相同的错误 完整类型脚本文件: