【问题标题】:TypeScript complaining about component missing properties which are injected by reduxTypeScript 抱怨组件缺少由 redux 注入的属性
【发布时间】:2020-11-21 17:33:37
【问题描述】:

我是 typescript 和 Redux 的新手。我正在使用 Redux 将属性(状态)注入到组件中。当我渲染组件时,我没有传递任何道具,因为它们是由 redux 注入的,所以它抱怨道具丢失了。 当我将鼠标悬停在 <RelatedFilesTableContainer/> 上时,我看到以下错误消息。感谢您的帮助!

确切错误:(TS) 类型“{}”缺少以下属性 输入“IReportStore”:showOrphaned、filters、filterFile

import * as React from "react";
import { RouteComponentProps } from "react-router";
import RelatedFilesTableContainer from "@Components/reportView/RelatedFilesTable";

type Props = RouteComponentProps<{}>;

const ReportPage: React.FC<Props> = () => {
    return <div>
        <RelatedFilesTableContainer />
    </div>;
}

export default ReportPage;

正在渲染的组件在下面

import React from "react"
import { Container, Table } from "react-bootstrap";
import CheckBoxContainer from "@Components/reportView/Checkbox"
import ReportTableHeader from "@Components/reportView/ReportTableHeader";
import CollapsibleRow from "@Components/reportView/CollapsibleRow";
import * as reportStore from "@Store/reportStore";
import { withStore } from "@Store/index";

let renderCollapsibleRows = (filterFile: Object) => {
    let collapsibleRows = [];
    console.log(filterFile.RelatedFiles);
    filterFile.RelatedFiles.forEach(relatedFile => collapsibleRows.push(<CollapsibleRow rowData={relatedFile}/>));
    return collapsibleRows;
}

type Props = reportStore.IReportStore;
const RelatedFilesTable: React.FC<Props> = ({ filterFile }) => {
    return (
        <Container>
            <div className="d-flex justify-content-between">
                <p>{filterFile.FilterFileName}</p>
                <CheckBoxContainer />
            </div>
            <Table striped bordered hover>
                <ReportTableHeader />
                <tbody>{renderCollapsibleRows(filterFile)}</tbody>
            </Table>
        </Container>
    )
}

// Connect component with Redux store.
var RelatedFilesTableContainer = withStore(
    RelatedFilesTable,
    state => state.report, // Selects which state properties are merged into the component's props.
    reportStore.actionCreators, // Selects which action creators are merged into the component's props.
);

export default RelatedFilesTableContainer

【问题讨论】:

    标签: reactjs typescript redux


    【解决方案1】:

    您希望您的 Props 定义还包括由 redux 注入的 props 的类型(使用 withState 函数)。您可以通过拆分单独的 mapStateToPropsmapDispatchToProps 函数并以此推断 Props 来做到这一点,如下所示:

    const mapStateToProps = (state) => state.report;
    const mapDispatchToProps = reportStore.actionCreators;
    
    type Props = reportStore.IReportStore &
      ReturnType<typeof mapStateToProps> &
      typeof mapDispatchToProps;
    
    const RelatedFilesTable: React.FC<Props> = ({filterFile}) => { ... }
    
    var RelatedFilesTableContainer = withStore(
      RelatedFilesTable,
      mapStateToProps,
      mapDispatchToProps,
    );
    
    export default RelatedFilesTableContainer;
    

    【讨论】:

    • 这可以抑制错误消息,但我注意到在解构 Props 时不再自动完成。在商店中,我有一个名为“showOrphaned”的属性,当我拥有您在此处提到的道具时,它不会自动完成。任何想法为什么?
    • 也许检查您的Props 是否被推断为any。这可能会发生 - 例如,如果您没有正确输入 state
    猜你喜欢
    • 1970-01-01
    • 2020-04-08
    • 2020-07-22
    • 2016-10-03
    • 2018-03-16
    • 2023-03-03
    • 2015-10-31
    • 2018-06-25
    • 1970-01-01
    相关资源
    最近更新 更多