【发布时间】:2021-05-07 04:03:16
【问题描述】:
我正在将 TypeScript 与 React 一起使用,我很困惑为什么 TS 无法判断如果 previous 是 undefined 时下面的钩子会提前返回。它抱怨previous.length(“对象可能未定义”),因为它认为以前可能是undefined,但事实并非如此,因为如果是这样,函数会提前返回
function ReactComponent() {
const previous = usePrevious(value)
React.useEffect(() => {
if (previous === undefined) {
return
}
if (previous.length) { // TS says "Object is possibly undefined" despite the return gate above
}
}, [previous])
return null
}
奇怪的是,这只是 React 钩子内部的一个问题。下面的代码不会抱怨...
const bar: Array<number> | undefined = undefined
function foo() {
if (bar === undefined) {
return
}
if (bar.length) { // TS does NOT complain here
}
}
我的快速修复想法是使用非空断言运算符 (!) 所以 previous!.length 但这也抱怨“在类型 never 上不存在属性长度”
编辑:这是usePrevious 挂钩的代码。
export default function usePrevious(value: any) {
const ref = React.useRef()
React.useEffect(() => {
ref.current = value
}, [value])
return ref.current
}
我可以通过明确声明此函数的返回类型为any 来解决此问题。换句话说,通过将function usePrevious(value: any) { ... } 更改为function usePrevious(value: any): any {...}
为什么这会修复它对我来说仍然是一个谜,所以我暂时保持开放状态。
【问题讨论】:
-
可选链接运算符是否修复它:
previous?.length?不知道为什么它在一种情况下抱怨而不是另一种情况 -
previous?.length抱怨“'never' 类型上不存在属性 'length'”。同previous!.length -
value是如何声明的? -
在您的情况下,
usePrevious的返回类型不是总是未定义吗?
标签: reactjs typescript react-hooks