javascript - 打字稿错误'类型参数不可分配给类型参数'
问题描述
我对 TS 比较陌生,遇到了一个奇怪的问题。我似乎已经定义了一切,但它似乎无法识别我输入的数据。
这是我所拥有的:
const Component = () => {
const [data, setData] = React.useState([[], []])
React.useEffect(() => {
fetchData()
}, [])
const fetchData = React.useCallback(async () => {
const data = await fetchDataController()
setData(data)
^^^^ error
})
}
这会引发错误,
Argument of type 'Element[][]' is not assignable to parameter of type 'SetStateAction<never[][]>'
Type 'Element[][]' is not assignable to type 'never[][]'
Type 'Element[]' is not assignable to type 'never[]'
Type 'Element is not assignable to type 'never'
我的函数fetchDataController
返回一个元素数组的数组。
我的类型如下:
type TData = {
id: string,
desc: string
}
我试过做类似的事情,
const [data, setData] = React.useState<Array<TData[], TData[]>>([[], []])
但这似乎不起作用。我在这里想念什么?
解决方案
你很亲密。Array<...>
需要一个参数,即数组中项目的类型。所以你可以做类似的事情Array<TData[]>
。如果你不想使用Array<...>
,你也可以做类似TData[][]
的事情
所以,
React.useState<TData[][]>([[], []])
这是一个带有一些模拟的工作代码框
如果您想更具体,并将其定义为Tuple,而不是通常的数组:
React.useState<[TData[], TData[]]>([[], []])
但要使其正常工作,您必须向 Typescript 保证您设置的 iedata
也是setData(data)
type [TData[], TData[]]
。
你可以用类似的东西来做到这一点setData(data as [TData[], TData[]])
推荐阅读
- macos - 为什么在 Mac 上 Angular 安装问题和权限失败?
- arrays - 将变量列表转换为数组
- python - TF 2.0 while_loop 和 parallel_iterations
- amazon-web-services - 是否可以从 AWS S3 批量下载?
- python - 根据请求触发 VS Code python 调试器
- java - Tika - 内存不足异常
- ios - 覆盖 UIView 的 UITraitCollection
- python - 模糊匹配加入两个数据框
- php - 如何更改已经创建的表?
- flutter - CircularProgressIndicator 在模拟器或 iOS 模拟器上导致 100% CPU