微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

类型 TS2339 上不存在属性“toDos”

如何解决类型 TS2339 上不存在属性“toDos”

我是第一次学习 ts 的初学者。预先感谢您分享您的知识。 我正在制作一个todolist。我用反应来完成它。但是现在我用 react 和 typescript 一起来完成代码

在我看来,'reducer' 工作不正常。我该如何操作?如果你让我知道,我将不胜感激。这是带有表面错误的“App.tsx”代码

import React,{ useState } from "react";
import Add from "./Add";
import List from "./List";
import Todo from "./Todo";
import Title from "./Title";
import Progress from "./Progress";
import styled from "styled-components";

interface ITodo {
  todos: string;
  completed: boolean;
}

function App() {
  const { todos,completed } = useState<ITodo>(); ? Error part
  return (
    <Title>
      <Add />
      <Progress />
      <Lists>
        <List title={todos.length !== 0 ? "To Dos" : ""}>
          {todos.map((todo: any) => (
            <Todo key={todo.id} id={todo.id} text={todo.text} isCompleted={false} />
          ))}
        </List>
        <List title={completed.length !== 0 ? "Completed" : ""}>
          {completed.map((todo: any) => (
            <Todo key={todo.id} id={todo.id} text
              {...todo.text} isCompleted />
          ))}
        </List>
      </Lists>
    </Title>
  );
}

export default App;

这段代码是我认为有问题的'reducer.tsx'代码

import { v4 as uuidv4 } from "uuid";
import { ADD,DEL,COMPLETE,UNCOMPLETE,EDIT } from "./actions";

export const initialState = {
  todos: [],completed: [],};

const reducer = ({ state,action }: any) => {
  switch (action) {
    case ADD:
      return {
        ...state,todos: [...state.todos,{ text: action.payload,id: uuidv4() }],};
    case DEL:
      return {
        ...state,todos: state.todos.filter((todo: { id: number; }) => todo.id !== action.payload),};
    case COMPLETE:
      const target = state.todos.find((todo: { id: number; }) => todo.id === action.payload);
      return {
        ...state,completed: [...state.completed,{ ...target }],};
    case UNCOMPLETE:
      const aTarget = state.completed.find(
        (todo: { id: any; }) => todo.id === action.payload
      );
      return {
        ...state,{ ...aTarget }],completed: state.completed.filter(
          (complete: { id: number; }) => complete.id !== action.payload
        ),};
    case EDIT:
      const bTarget = state.todos.find((todo: { id: number; }) => todo.id === action.id);
      const rest = state.todos.filter((todo: { id: number; }) => todo.id !== action.id);
      return {
        ...state,todos: rest.concat({ ...bTarget,text: action.payload }),};
    default:
      return;
  }
};

export default reducer;

代码是“context.tsx”代码

import React,{ createContext,useReducer,useContext } from 'react';
import reducer,{ initialState } from "./reducer";

export type Todo = {
  id: number;
  text: string;
  done: boolean;
};

export type Todosstate = Todo[];

const TodosContext = createContext<Todosstate | any>(undefined);

const TodosProvider = ({ children }: { children: React.ReactNode }) => {
  const [state,dispatch] = useReducer(reducer,initialState);
  return (
    <TodosContext.Provider value={{ state,dispatch }}>
      {children}
    </TodosContext.Provider>
  );
};

export const usedispatch = () => {
  const { dispatch } = useContext(TodosContext);
  return dispatch;
};

export const useState = () => {
  const { state } = useContext(TodosContext);
  return state;
};

export default TodosProvider;

解决方法

这里发生的事情是由于命名混乱。您创建了一个自定义钩子 useState,它与一个内置的 React 钩子同名,但您使用了错误的钩子。

这里出现错误:

const { toDos,completed } = useState<ITodo>(); ? Error part

因此:

import React,{ useState } from "react";

您想使用自定义 useState 钩子,它返回一个具有 toDoscompleted 属性的对象。但是,您没有导入该钩子,而是导入了内置的 React 钩子 useState,它返回一个包含两个条目(statesetState)的数组。

进入 context.tsx 并将您的自定义挂钩重命名为不那么模糊的名称,例如 useTodosStateuseTodosDispatch。这不是严格要求的,但它会让生活变得更轻松!

然后进入 App.tsx 并将 useState 替换为 useTodosState,确保从 context.tsx 导入它。既然您已经确定要使用哪个钩子,您就无需担心 IDE 会自动从 React 导入 useState

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?