【问题标题】:Don't use `object` as a type. The `object` type is currently hard to use不要使用 `object` 作为类型。 `object` 类型目前很难使用
【发布时间】:2021-01-24 04:08:22
【问题描述】:
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 类型目前很难使用 (see this issue)。

【问题讨论】:

  • 您的实际问题是什么?请参阅How to Ask
  • 意思是不要使用对象类型,因为[几乎] 一切都是对象。你必须以不同的方式输入它

标签: typescript


【解决方案1】:

对象类型几乎已被弃用,因为一切都是对象。对于对象,使用{} 类型,它将允许任何属性。对于所有内容,请使用any。但是一切都是对象,所以主要的 any 属性(一切的类型)没有意义。所以 TypeScript 现在用来关闭类型检查。不要使用它。

所以一切都是对象,不要使用extends object。仅使用T


为什么一切都是对象? JavaScript(TypeScript 也是如此)一直是一种面向对象的编程语言。 JS 与 Java 不同(例如),因为它是基于原型的,而 C 类通常是基于类的。 TS/JS 中的每个值都扩展自 Object 类,在 Java 和 C# 中也是如此。任何对象都具有"string" 具有的属性——您可以使用"string".toUpperCase()。同样适用于数字、类对象 (new XMLHttpReqeust)、静态类 (Math)、文字对象,因为没有属性 ({}.hasOwnProperty)、数组等等...

【讨论】:

  • 如果不是对象,在函数中处理?
  • 一切都是对象
  • 这是不正确的。有一些不是对象的原始类型(数字、字符串、null 等)。您可以调用字符串、数字和布尔值的方法,因为编译器在看到您将它们视为对象时会将它们包装到对象中。
猜你喜欢
  • 1970-01-01
  • 2021-09-11
  • 2018-11-12
  • 1970-01-01
  • 1970-01-01
  • 2021-10-12
  • 2017-04-10
  • 2022-12-23
  • 1970-01-01
相关资源
最近更新 更多