【发布时间】:2021-07-04 20:30:16
【问题描述】:
理想情况下,我想知道为什么 ts 在下面的情况下不会抛出任何错误,以及是否有办法解决它以使其按预期工作。
尝试通过useState 的调度程序回调更新某些状态时,我预计会出现打字稿错误,但没有任何反应。这似乎是有效的:
type State = {
age?: number;
};
const [, setState] = useState<State>();
setState((prev) => {
// const copy = { ...prev };
// this is a ts error;
// copy.name = "scotty";
// this is not
return { ...prev, name: "scotty" };
});
我希望 ts 在额外的未声明字段 name 上引发错误(我可以指定返回类型,但我不应该这样做,因为应该推断调度的参数 ((prevState: S) => S))。
我怎样才能输入这样我得到我期待的 ts 错误;此更新唯一允许的字段应该是在State 中定义/类型的字段。
最重要的是为什么这不起作用?
这里有一个codesandbox 来玩。
【问题讨论】:
-
一般来说,Typescript 不认为额外的属性是一个问题。如果一个对象适合
{age?: number},那么它就是State。
标签: reactjs typescript react-hooks typescript-generics react-typescript