reactjs - 推送状态数组 React with TypeScript

标签 reactjs typescript

我试图通过 addTask 方法在我的任务数组中添加一个任务对象,这个方法获取以前的状态并添加新任务,它适用于 JSX 但当我使用 typescript 。我得到的错误是

Type 'ITask[] | undefined' is not an array type or a string type. Use compiler option '--downlevelIteration' to allow iterating of iterators.  TS2569
import React, { Fragment } from 'react';

interface ITask {
    name: string;
    done: boolean;
}

interface IProps {

}

interface IState {
    newTask?: string;
    tasks?: Array<ITask>;
}

class App extends React.Component<IProps, IState>{
    constructor(props: any) {
        super(props);
        this.state = {
            newTask: '',
            tasks: []
        }
    }


    addTask(name:string) {
        this.setState(prevState => ({
            tasks: [...prevState.tasks, {name, done: false}]
        }));
    }

    render() {
        return (
            <Fragment>
            </Fragment>
        );
    }
}

最佳答案

您可能必须将新对象显式键入为 ITask,以告诉 TypeScript 编译器您正在将类型为 ITask 的对象推送到 tasks 状态。

此外,tasks 是可选的。解决此问题的一种方法是在传播时设置默认值(空数组 [])。

addTask(name:string) {
  const newTask: ITask = {name, done: false}
  this.setState((prevState) => ({
    tasks: [...(prevState.tasks ?? []), newTask]
  }));
}

鉴于 tasks(甚至 newTask)实际上在构造函数中被分配了一个值,实际上没有必要在您的 IState 中将其标记为可选 界面。

interface IState {
  newTask: string;
  tasks: Array<ITask>;
}

这将使您无需在设置状态时检查 tasks 是否为 undefined

关于reactjs - 推送状态数组 React with TypeScript,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61200631/

相关文章:

javascript - 我如何在 React Router DOM v6 上使用 MemoryRouter 测试位置?

typescript - 如何修复 typescript 中的 'Cannot use namespace as a type ts(2709)'?

javascript - Firebase:使用预留主机 URL 时未创建 Firebase 应用程序 '[DEFAULT]'

reactjs - Apollo Client React 容器将创建的元素添加到分页元素列表中而无需重新获取

javascript - 如何获取 yandex map 上单击的地标的 ID?

angularjs - Typescript + Angular "controller as"Sidewaffle 模板开箱即用

typescript - 返回的变量是对象 promise 类型并且无法渲染

reactjs - Material-UI 组件的样式化组件 typescript 错误

css - 带有 React 和 Webpack 的 Material Design Lite

javascript - 过滤不以字母开头的字符串数组