Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typescript/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Reactjs 就像在React钩子中一样,为初始值指定一个空对象_Reactjs_Typescript - Fatal编程技术网

Reactjs 就像在React钩子中一样,为初始值指定一个空对象

Reactjs 就像在React钩子中一样,为初始值指定一个空对象,reactjs,typescript,Reactjs,Typescript,我有这个密码 export interface Y{ title: string; name: string; } const [x, setX] = useState<Y>(Object); 导出接口Y{ 标题:字符串; 名称:字符串; } const[x,setX]=useState(对象); 但是我的朋友说这是个坏主意。 为什么使用这个useState(对象)是个坏主意?const[x,setX]=useState(对象) 这是无效的typescript,因为使用

我有这个密码

export interface Y{
  title: string;
  name: string;
}

const [x, setX] = useState<Y>(Object);
导出接口Y{
标题:字符串;
名称:字符串;
}
const[x,setX]=useState(对象);
但是我的朋友说这是个坏主意。
为什么使用这个useState(对象)是个坏主意?

const[x,setX]=useState(对象)

这是无效的typescript,因为使用泛型参数
会使类型系统期望初始状态为
Y
(或null)类型,从而生成唯一有效的输入,
useState({title:'',name:''})
useState(null)

此外,useState钩子不会对状态执行部分更新

export interface Y{
  title: string;
  name: string;
}

const [x, setX] = useState<Y>({ title: 'Mr', name: 'Jack' });

setX({ name: 'John' })  // <-- title: undefined

setX({ ...x, name: 'john' }) // <-- You will have to do this instead
导出接口Y{
标题:字符串;
名称:字符串;
}
const[x,setX]=useState({title:'Mr',name:'Jack'});

setX({name:'John'})/好吧,我觉得奇怪的是,你将
对象
传递给useState钩子

导出接口Y{
标题:字符串;
名称:字符串;
}
const[x,setX]=useState();
在这种情况下,x的类型是
Y | undefined
,这更好,因为现在我们知道x是空的

像你那样传递
Object
会让typescript高兴,但现在你欺骗自己,因为typescript不会保护你

根据具体情况,我建议选择第一条路线,将useState保留为空,或硬编码对象结构,例如

const [x, setX] = useState<Y>({title: '', name: ''});
const[x,setX]=useState({title:'',name:''});

如果问题是使用useReducer还是useState,那么我认为这完全取决于您更改对象的频率。如果逻辑足够简单,那么使用useReducer可能是一种过度使用。另外,别忘了useState只是useReducer钩子的包装,afaik

下面的代码适合我

const [selectedAccount, setselectedAccount] = useState(Object);

useState(对象)这是什么?您是否试图将内置对象原型作为初始状态值传递?@Аааааvar对象:ObjectConstructor。我自己不明白这意味着什么。但是我得到了一个空的物体,初始状态。正如我所说,我的朋友们因为我这样的行为责骂我,但无法解释为什么这是一个坏主意。你怎么知道你得到了一个空的物体?@Аааааааа看着它。我的问题是,如果你这样写,会发生什么;2为什么我没有得到错误?3 useState()之间的差异;和使用状态(对象);1.如果我们看一下react类型定义函数
useState(initialState:S |(()=>S)):[S,Dispatch]
我们看到它接受一个函数,因此对象被视为函数,并且您可能会猜到调用
对象
的结果是空对象
{}
注意:只是为了好玩,尝试一下这个
类MyClass{};const[x,setX]=useState(MyClass)
您将得到一个错误
无法将类作为函数调用
我想听听最终答案使用
useState(Object)。这是错误的方式,因为它会导致……?对不起,我想我已经回答了你所有的问题。总而言之,我认为写<代码> UsStand(对象)是一个坏主意;代码>cuz:1-您在typescript中失去typesafety;2-这不是一个明显的代码。我敢打赌,即使是有经验的开发人员也会花一些时间来理解变量
x
中的值。这是我个人的建议:您为其他开发人员编写代码,这就是为什么要尽可能使其可读。如果您认为这段代码会导致一些性能问题和可能的错误,那么这是比较安全的。