使用打字稿的jsdoc支持键入以下 javascript 代码:
const [optionalNumber, setOptionalNumber] = useState(null)
const handleClick = () => {
setOptionalNumber(42)
// ^-- Argument of type '42' is not assignable to parameter of type 'SetStateAction<null>'
}
我目前解决这个问题的方法很有效,但是有点难看:
const [optional, setOptional] = useState(
/** @type {number|null} */ (null)
)
如何在不使用强制转换的情况下完成此任务?我希望optional
的类型为null | number
,而setOptional
只接受null | number
作为参数。
展示此代码的代码框:
https://codesandbox.io/s/optimistic-villani-kbudi?fontsize=14
答案 0 :(得分:2)
假设您的组件依赖于optional
值的null
状态的初始状态(而不是undefined
),一种解决方案是将状态挂钩类型显式指定为number
和null
的{{3}}就像这样:
// Allows initial value to be null, and number to be subsequently set
const [optional, setOptional] = useState<number | null>(null);
// optional === null
setOptional(42);
或者,如果您的组件没有针对初始undefined
状态值在null
或optional
之间进行区分,则可以进行以下操作:
const [optional, setOptional] = useState<number>();
// optional === undefined
setOptional(42);
答案 1 :(得分:1)
我认为您可以使用正确的联合类型定义一个初始值,并将其传递给useState
。
会是这样的:
/**
* @type {number | null}
*/
const initValue = 42;
const [optionalNumber, setOptionalNumber] = useState(initValue)