Reactjs/Typescript 无法将项目数组作为属性传递给子项

Chr*_*ond 4 javascript arrays properties typescript reactjs

我在一个项目中有几个类,使用 create-react-app 创建,我想将一组对象传递给子元素,如下所示。

// Items.tsx
import * as React from 'react';
import ItemTable from './ItemTable';
import { IItem } from './ItemRow';

class Items extends React.Component {
    private items = IItem[];
    componentWillMount() {
      // connect to backend service and retrieve all Items
      items = get_items();
    }

    render() {
      return (
        <ItemTable items={this.items} />
      );
    }
}

export default Items;

////////////////////////////////////////////////////////////////

// ItemsTable.tsx
import * as React from 'react';
import { Table } from 'reactstrap';
import ItemRow from './ItemRow';

let ItemTable = (items: IItem[]) => (
  <Table>
    <thead>
      <tr>
        <th>Name</th>
        <th>Description</th>
        <th>Website</th>
      </tr>
    </thead>
    <tbody>
        {items.map(item => (
          <ItemRow item={item} />
        ))}
    </tbody>
  </Table>
);

export default ItemTable;

////////////////////////////////////////////////////////////////

// ItemRow.tsx
import * as React from 'react';

export interface IItem {
  name: string;
  description: string;
  website: string;
}

let ItemRow = (item: IItem) => (
  <tr>
    <td>{item.name}</td>
    <td>{item.description}</td>
    <td>{item.website}</td>
  </tr>
);

export default ItemRow;
Run Code Online (Sandbox Code Playgroud)

可悲的是,在构建/编译期间,我不断收到错误消息,指出'{ items: IItem[]; }'无法将 type 分配给 type 'items: IItem[]'。请注意,与第一个实例相比,第二个实例中缺少大括号。

我认为 Typescript 或 React 显然是将数组粘贴到一个对象中,而不是像我期望的那样传递数组。

谁能弄清楚我在这里可能做错了什么?

klu*_*gjo 5

您需要将 props 传递给您的ItemTable,而不是直接传递给项目

let ItemTable = (items: IItem[]) => (
Run Code Online (Sandbox Code Playgroud)

应该

let ItemTable = (props: {items: IItem[]}) => (
  const {items} = props;
Run Code Online (Sandbox Code Playgroud)

也可以缩写为

let ItemTable = ({items}: {items: IItem[]}) => (
Run Code Online (Sandbox Code Playgroud)

  • 扩展一下,这是 React 组件仅将对象作为参数(本例中为 props 对象)的结果。此解决方案相当于创建一个名为“IItemList”的接口,其属性名为“items”,并执行 `... = ({items}: IItemList) =&gt; ...` (2认同)