[英]Initial state as an object in React
I have a following state in React:我在 React 中有以下 state:
interface A {
foo: string;
}
const [val, setVal] = useState<A>({});
// ^^^ error
However Im getting error that Im missing foo
in the initial state. But I dont have any initial value for foo
field.但是我得到错误,我在初始 state 中缺少foo
。但是我没有foo
字段的任何初始值。
What is the proper way to handle it?正确的处理方法是什么?
useState<Partial<A>>({});
or
useState<A>({} as A);
or make `foo` optional?
useState<{ foo?: string }>({});
What is the correct fix for such situation?这种情况的正确解决方法是什么?
I think this solution is good:我认为这个解决方案很好:
useState<{ foo?: string }>({});
Other solution is:其他解决方案是:
interface A {
foo: string;
}
const [val, setVal] = useState<A>({ foo: '' });
You have 3 options to fix your issue.您有 3 个选项来解决您的问题。
interface A {
foo?: string;
}
const [val, setVal] = useState<A>({});
interface A {
foo: string;
}
const [val, setVal] = useState<A>({ foo: '' });
interface A {
foo: string;
}
const [val, setVal] = useState<A | undefined>();
If you want to handle undefined
initial state then use undefined
.如果你想处理undefined
的初始 state 然后使用undefined
。
interface A {
foo: string;
}
const [val, setVal] = useState<A | undefined>();
Then you have a good chance to handle undefined
inside your component.然后你就有很好的机会在你的组件中处理undefined
。 You also get help from your IDE.您还可以从您的 IDE 获得帮助。
I think this is property of typescript and if val state is using A interface it must have foo property with string value if its possible for your code to have initial foo value it would be better to add it like this:我认为这是 typescript 的属性,如果 val state 使用 A 接口,它必须具有带字符串值的 foo 属性,如果您的代码可能具有初始 foo 值,最好像这样添加它:
useState<A>({
foo:''
})
if not, my suggestion is using this syntax:如果没有,我的建议是使用这种语法:
useState<A | undefined>()
The answer is, it depends on how your app should work.答案是,这取决于您的应用程序应该如何工作。 Take a look at possible solutions and decide which is fitting your logic or app context查看可能的解决方案并确定哪个适合您的逻辑或应用程序上下文
https://www.typescriptlang.org/play?ssl=43&ssc=11&pln=44&pc=20#code/JYWwDg9gTgLgBAJQKYEMDGMA0BvArgZyQGUYUYkBfOAMyghDgHIpUNGAod4AO3KmvRI4AQTjZ2cSTQgQAXHHwwoPAOYBudhU4B6bXCIQANrhjAI3OAEY4Ad2AwAFnDQEY9ODACeYJCtwooABN2alxuDDMLYHxhADkIGABRcC8AChR5UQAfMQoASnkUOGiRMQkpFhhcKAt0uBR8ETyAOmoZOABCAF4uuDDApGoeJECNLXY0c0URMDA4XtS8roA+cSlnKfgAbRRMQhhhAF0ugmJScgAebNzl1Ox8jXXdDe5pnb2kA+PTkjIkK9u93qjWEeTUcAAIuZGPBTsDCLBInAAEZINAoOH2ZwoCyGVCBDwQYr4fC4JCNaAo3AqfCYPrheggJC8DYDercAmEISOMj1VrtQzDKwATmJcAgAGsqfAseiLKi4EgUp5xaiAFYYTjrSrVbipcrrSQXZYGw3rbDROIJZJgNIoPJwABkjr5bQgWjNZuwKH57tN6wu2hN6zymh0egMxlM5jgACZbPYnNxcIZDOKoPSBkNuCMJpsZmB4wslqtTc9Jq9trt9kcToRfpdrsnU7dm4YwaaK29q59az9zv9rv1BsNArdh9mRh3TTqavrPXBjf7Pd6nS6fW6PZ7A8GpKHxs9IyYkQBmOAASW4WLAdB8sBVdkccCzGMM8AAbihjEg85WC2fixWNYpC7KsPi+Oszj+AE7mXSQ3XkRgIUGDEYDTT9v2kDM3Q4dYHi1CpPl1edt13BdJG9X0tzNHdTX3TgeD4AQ0CEYRRGA+CZAAfnkRRlG4dQw3YQ8jGPGMzwAWRQCUhAgW1Ii-aQiRvOSkHvYpqGKGBGEadAqi-QwVTk6NuC-X9pmEWYABZ5jgRYgM7fN3hrb56wHK5hEBfCZyIuc4MXMjyMot1Oh6TMRxzAl https://www.typescriptlang.org/play?ssl=43&ssc=11&pln=44&pc=20#code/JYWwDg9gTgLgBAJQKYEMDGMA0BvArgZyQGUYUYkBfOAMyghDgHIpUNGAod4AO3KmvRI4AQTjZ2cSTQgQAXHHwwoPAOYBudhU4B6bXCIQANrhjAI3OAEY4Ad2AwAFnDQEY9ODACeYJCtwooABN2alxuDDMLYHxhADkIGABRcC8AChR5UQAfMQoASnkUOGiRMQkpFhhcKAt0uBR8ETyAOmoZOABCAF4uuDDApGoeJECNLXY0c0URMDA4XtS8roA+cSlnKfgAbRRMQhhhAF0ugmJScgAebNzl1Ox8jXXdDe5pnb2kA+PTkjIkK9u93qjWEeTUcAAIuZGPBTsDCLBInAAEZINAoOH2ZwoCyGVCBDwQYr4fC4JCNaAo3AqfCYPrheggJC8DYDercAmEISOMj1VrtQzDKwATmJcAgAGsqfAseiLKi4EgUp5xaiAFYYTjrSrVbipcrrSQXZYGw3rbDROIJZJgNIoPJwABkjr5bQgWjNZuwKH57tN6wu2hN6zymh0egMxlM5jgACZbPYnNxcIZDOKoPSBkNuCMJpsZmB4wslqtTc9Jq9trt9kcToRfpdrsnU7dm4YwaaK29q59az9zv9rv1BsNArdh9mRh3TTqavrPXBjf7Pd6nS6fW6PZ7A8GpKHxs9IyYkQBmOAASW4WLAdB8sBVdkccCzGMM8AAbihjEg85WC2fixWNYpC7KsPi+Oszj+AE7mXSQ3XkRgIUGDEYDTT9v2kDM3Q4dYHi1CpPl1edt13BdJG9X0tzNHdTX3TgeD4AQ0CEYRRGA+CZAAfnkRRlG4dQw3YQ8jGPGMzwAWRQCUhAgW1Ii-aQiRvOSkHvYpqGKGBGEadAqi-QwVTk6NuC-X9pmEWYABZ5jgRYgM7fN3hrb56wHK5hEBfCZyIuc4MXMjyMot1Oh6TMRxzAl nVdGRqMNWiQzDIA nVdGRqMNWiQzDIA
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.