【问题标题】:Expected 1 arguments, but got 0预期 1 个参数,但得到 0
【发布时间】:2020-11-07 22:41:11
【问题描述】:

我使用 TypeScript 在 react 中创建了自定义钩子,但出现以下错误,对此我没有任何想法:

const getMode: (mode: any) => any
Expected 1 arguments, but got 0.ts(2554)
DarkModeStatus.tsx(2, 20): An argument for 'mode' was not provided.

我在这里使用的方法(func)没有获取任何参数,当我调用getMode() 时,我收到了上述消息。

这是我的自定义钩子代码:

export const useDarkModeStatus = () => {
  const setMode = (mode): void => {
    console.log(mode, " setMode")
    typeof window !== "undefined" &&
      window.localStorage.setItem("theme", JSON.stringify(mode))
  }

  const getMode = () =>
    typeof window !== "undefined" &&
    JSON.parse(window.localStorage.getItem("theme"))
  return [getMode, setMode]
}

我已经调用了我的函数:

import { useDarkModeStatus } from "../components/DarkModeStatus/DarkModeStatus"
 const [getMode] = useDarkModeStatus()
 useEffect(() => {
    const value = getMode()
    dispatch({ type: "INITIAL_MODE", value })
  }, [])

当我将参数传递给getMode('yes') 时,即使我没有收到任何参数,错误也已解决,谢谢!

【问题讨论】:

  • return [getMode, setMode] as const。否则,它会比您预期的更通用地推断类型。或者显式声明返回的类型。另一个例子:const foo = [1, 'foo']; - 你认为这个变量是什么类型的?然后与as const比较。
  • @zerkms 所以因为它是一个数组,所以它使两者的类型相同?我想这是有道理的,即使这里很奇怪。我想这两个也可以单独导出,这也可以解决问题。
  • @VLAZ 它试图找到适合所有成员的最通用类型。这是编译器最合理的场景:它根本不做任何假设。
  • @zerkms 是的,谢谢。这确实有道理,真的。而且它不会推广到Function,因为它太宽了,所以我想它会转到(mode: any) => any
  • @zerkms 谢谢它解决了问题,我希望你写下答案!

标签: typescript


【解决方案1】:

编译器试图推断类型不会太宽,也不会缩小以适合所有成员。

根据您提供的详细信息(完全没有),返回结果的推断类型将是:

(() => any | (any) => void)[]

鉴于此,此函数返回值的第一项是() => any | (any) => void。你不能在没有参数的情况下调用它。

要修复它,您必须明确声明useDarkModeStatus 的返回类型,或者输入as const

return [getMode, setMode] as const;

这样 TS 会使用尽可能具体的类型:由 2 个元素组成的元组,每个项目都具有尽可能具体的类型。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-01-24
    • 2018-08-14
    • 1970-01-01
    • 2021-07-29
    • 2021-08-22
    • 2019-08-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多