reactjs - 在设置状态时如何正确提供类型?
问题描述
我想使用 useState 将对象存储在反应状态并将 setState 传递给子组件,但随后出现打字稿错误。怎么了?
打字稿错误
Argument of type '(oldPerson: any) => any' is not assignable to parameter of type 'Person'.
代码
interface Person {
name: string
age: number
job: string
}
const [person, setPerson] = useState<Person | null>()
const updateOldPerson={
age: 70
}
setPerson((oldPerson) => ({
...oldPerson,
...updateOldPerson
}))
解决方案
如果你想使用null
类型,那么初始状态不应该是未定义的
const [person, setPerson] = useState<Person | null>(null)
为了同时使用功能状态更新和正常状态更新,类型setPerson
可以是
setPerson: Dispatch<SetStateAction<Person | null>>;
如果您将此作为道具传递给子组件,则道具界面应如下所示
interface ChildProps {
setPerson: Dispatch<SetStateAction<Person | null>>;
}
const Child: FunctionComponent<ChildProps> = ({ setPerson }) => {
return (
<button
onClick={() => {
const updatedPerson = {
name: "vuvu",
age: 69,
job: "foo"
};
setPerson((prevPerson) => ({ ...prevPerson, ...updatedPerson }));
}}
>
Update Person
</button>
);
};
这是一个有效的代码框示例
由于年龄、姓名、工作属性不是可选的,因此请确保使用包含所有三个字段的人员对象更新状态。或者,您可以将某些字段设为可选,例如
interface Person {
name: string;
age: number;
job?: string; // this is optional
}
推荐阅读
- sql - VBA 到 SQL 存储过程参数格式问题
- nginx - 基于 access_by_lua_block 中设置的 ngx.var 的动态 Nginx 上游
- multithreading - 使用多线程时无法初始化 global.run
- python - 尝试制作遗传算法
- github - 通过 livy 提交存储在 github 中的文件以触发 spark
- django - 谷歌云构建错误:找不到 --substitutions 标志
- php - 使用 PHP 中的 PayPal API 直接将资金从一个个人帐户转移到另一个帐户
- json - VB.Net 将 JSON 数组解析为键值对的字典以实现与 Xojo 代码相同的结果,(示例)
- bash - sed 命令 a 需要 \ 后跟文本
- node.js - 将套接字 IO 与我的 Angular 客户端和节点服务器连接时出错