const useSetState = <T extends object>(
initialState: T = {} as T
): [T, (patch: Partial<T> | ((prevState: T) => Partial<T>)) => void] => {
const [state, setState] = useState<T>(initialState);
const setMergeState = useCallback(
(patch) => {
setState((prevState) => ({
...prevState,
...(patch instanceof Function ? patch(prevState) : patch),
}));
},
[setState]
);
return [state, setMergeState];
};
但我发现这个错误:不要使用object
作为一种类型。这object
类型目前很难使用(看到这个问题 https://github.com/microsoft/TypeScript/issues/21732).
对象类型几乎已被弃用,因为一切都是对象。对于对象,使用{}
类型,它将允许任何属性。对于一切,使用any
。但一切都是对象,所以主要的any属性(一切的类型)没有意义。所以 TypeScript 现在用来关闭类型检查。不要使用它。
所以一切都是对象,不要使用extends object
。仅供使用T
.
Why 一切都是对象? JavaScript(所以 TypeScript 也是如此)一直是一种面向对象的编程语言。例如,JS 与 Java 不同,因为它是基于原型的,而类 C 通常是基于类的。 TS/JS 中的每个值都继承自 Object 类,Java 和 C# 中也是如此。任何对象都有其值的属性"string"
有 - 你可以使用"string".toUpperCase()
。对于数字、类的对象也是如此(new XMLHttpReqeust
)、静态类(Math
),文字对象,因为没有属性 ({}.hasOwnProperty
)、数组等等...
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)