【发布时间】: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