简体   繁体   English

初始 state 作为 React 中的 object

[英]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 个选项来解决您的问题。

  1. Make the foo property optional:使 foo 属性可选:
interface A {
   foo?: string;
}

const [val, setVal] = useState<A>({});
  1. Initialize your object with empty string:使用空字符串初始化 object:
interface A {
   foo: string;
}

const [val, setVal] = useState<A>({ foo: '' });
  1. Change the type of your state:更改 state 的类型:
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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM