Javascript React typescript Object.assign返回类型

Javascript React typescript Object.assign返回类型,javascript,reactjs,typescript,destructuring,Javascript,Reactjs,Typescript,Destructuring,我有一个小的自定义钩子,它返回一个Object.assign结果。在文档中,它说这将返回一个数组,但下面的示例可用于数组的分解和对象的分解 代码: 此代码可通过以下方式使用: const {data, setData, loading, setLoading} = useStateExtended({}); const [data, setData, loading, setLoading] = useStateExtended({}); 这是怎么回事?为什么我可以将其分解为数组和对象 第二:

我有一个小的自定义钩子,它返回一个Object.assign结果。在文档中,它说这将返回一个数组,但下面的示例可用于数组的分解和对象的分解

代码:

此代码可通过以下方式使用:

const {data, setData, loading, setLoading} = useStateExtended({});
const [data, setData, loading, setLoading] = useStateExtended({});
这是怎么回事?为什么我可以将其分解为数组和对象

第二:如何在Typescript中键入这个?数据类型包括:

data: any;
setData: (data: any) => void;
loading: boolean;
setLoading: (boolean) => void;

您可以使用方括号对任何具有迭代器的对象进行分解,最明显的是,包括数组

可以对任何对象使用花括号分解,数组就是对象

当你这样做的时候

Object.assign([data, setData, loading, setLoading], { data, setData, loading, setLoading })
您创建的数组既有普通数组标记[0]、[1],又有properties.data、.setData等。这在Javascript中非常奇怪,但由于数组是对象,并且对象可以分配任意键值对,因此这是合法的

因此,您可以通过使用[destructuring]调用数组的迭代器,或者通过使用{destructuring,从对象中提取命名属性,从对象中检索属性

也就是说,这不是你应该做的事情,因为正如你的问题所表明的,这有点让人困惑,可读性可能是代码最重要的因素。数组几乎不应该有任意的键值对,除非在正则表达式匹配的情况下,在这种情况下,额外的属性是由解释器本身生成

要键入它,请对initialValue的类型使用泛型,以便可以将其传递给useState,并将数组声明为常量,以便数组分解按正确的顺序检索正确的类型:

const useStateExtended = <T extends unknown>(initialValue: T, initialLoading = false) => {
    const [data, setData] = useState<T>(initialValue);
    const [loading, setLoading] = useState(initialLoading);
    return Object.assign([data, setData, loading, setLoading] as const, { data, setData, loading, setLoading })
};

谢谢!我该如何在typescript中键入它?我在问题中添加了这些类型。你有什么建议?我认为我可以同时使用数组和对象解构是非常重要的,因为我正在使用它们来安装一个React Playword来试用它。有关如何键入它的示例,请参见编辑。但不应该需要使用h保留同一数据的数组属性和对象属性-选择一种方法—数组或对象,然后在任何地方使用它,一旦一种方法起作用,就不需要使用另一种方法
const useStateExtended = <T extends unknown>(initialValue: T, initialLoading = false) => {
    const [data, setData] = useState<T>(initialValue);
    const [loading, setLoading] = useState(initialLoading);
    return Object.assign([data, setData, loading, setLoading] as const, { data, setData, loading, setLoading })
};