Javascript 使用TypeScript使用React效果挂钩
我正在尝试使用React和Typescript创建一个简单的TODO应用程序,但是我得到的“参数'id'隐式地具有'any'类型。TS7006” 我编写了以下代码Javascript 使用TypeScript使用React效果挂钩,javascript,reactjs,typescript,react-hooks,Javascript,Reactjs,Typescript,React Hooks,我正在尝试使用React和Typescript创建一个简单的TODO应用程序,但是我得到的“参数'id'隐式地具有'any'类型。TS7006” 我编写了以下代码 import React,{useState, useEffect} from 'react'; import {Container } from "reactstrap"; import "bootstrap/dist/css/bootstrap.min.css"; import "
import React,{useState, useEffect} from 'react';
import {Container } from "reactstrap";
import "bootstrap/dist/css/bootstrap.min.css";
import "./App.css";
import Todos from "./Components/Todos";
import TodoForm from "./Components/TodoForm";
const App=()=>{
const[todos, setTodos]=useState([])
useEffect(()=>{
const localTodos=localStorage.getItem("todos")
if(localTodos){
setTodos(JSON.parse(localTodos))
}
},[])
const addTodos= async addtodo=>{
setTodos([...todos, todos]);
}
useEffect(()=> {
localStorage.setItem("todos", JSON.stringify(todos))
} , [todos]);
const markComplete=id=>{
setTodos(todos.filter(todo=>todo.id !== id))
};
return(
<Container fluid>
<h1>todo with local storage</h1>
<Todos todos={todos} markComplete={markComplete}/>
<TodoForm addTodos={addTodos}/>
</Container>
)
}
export default App;
import React,{useState,useffect}来自“React”;
从“reactstrap”导入{Container};
导入“bootstrap/dist/css/bootstrap.min.css”;
导入“/App.css”;
从“/Components/TODO”导入TODO;
从“/Components/TodoForm”导入TodoForm;
常量应用=()=>{
const[todos,setTodos]=useState([]
useffect(()=>{
const localTodos=localStorage.getItem(“todos”)
if(localTodos){
setTodos(JSON.parse(localTodos))
}
},[])
const addtodo=异步addtodo=>{
setTodos([…todos,todos]);
}
useffect(()=>{
localStorage.setItem(“todos”,JSON.stringify(todos))
}[待办事项];
常量markComplete=id=>{
setTodos(todos.filter(todo=>todo.id!==id))
};
返回(
本地存储的todo
)
}
导出默认应用程序;
您的markComplete
函数有一个未定义类型的参数id
。因此编译器将其定义为any
。根据todo对象的id
类型,尝试使用类似string
或number
的类型。像这样:
const-markComplete=(id:string)=>{
setTodos(todos.filter(todo=>todo.id!==id))
};
您的markComplete
函数正在接受一个id
,我假设这是字符串类型,因此将其标记为-
const-markComplete=(id:string)=>…
typescript既有隐式类型也有显式类型,使用隐式类型时,它将根据以前的代码尝试确定要使用的类型,但在您的情况下它不能,因此它警告您,它正在标记为any
。如果确实要允许隐式any
,可以在tsconfig中将noImplicitAny
属性设置为false
公平地说,上面的所有代码都是用纯javascript编写的。我希望看到一个类型
或接口
用于待办事项
,并开始在整个过程中使用它,例如
const[todos,setTodos]=useState([])
及
const addTodo=(todo:todo)=>…
然后,您将获得typescript的好处,例如,如果您试图将非Todo
的内容添加到Todo
数组中,则会出现错误我的首选解决方案是将以下行添加到tsConfig文件中:
"noImplicitAny": false
这通常允许没有被解释为“任何”的类型。如果你没有这个,你需要添加一个类型到你所有的东西