reactjs - 带有 React 的 TypeScript - 'string' 类型的参数不可分配给'keyof T' 类型的参数
问题描述
我有一个使用 TypeScript 和 React Hooks 构建的排序功能,但我遇到了一些问题。
具体来说,我收到一条错误消息:
Argument of type 'string' is not assignable to parameter of type 'keyof T'.
Type 'string' is not assignable to type 'never'.ts(2345)
您可以在 CodeSandbox 上查看排序功能以及我如何尝试对其进行测试
我不太确定never
会从哪里来。
任何有用的链接将不胜感激。
我会尝试删除一些不必要的代码,但我有一个坏习惯,即删除代码会改变上下文(使用 TypeScript 时),这会导致答案可能对我的用例没有帮助。
import { useState, useEffect } from "react";
export function SortByKey<T extends object>({
data,
sortKey
}: {
data: T[];
sortKey: keyof T;
}) {
let sortable = [...data];
sortable.sort((a: T, b: T) => {
if (a[sortKey] < b[sortKey]) {
return -1;
}
if (a[sortKey] > b[sortKey]) {
return 1;
}
return 0;
});
return sortable;
}
export default function App<T extends object>({ data }: { data: T[] }) {
const [sortedData, setSortedData] = useState(data);
const sortKeys: string[] = Object.keys(data[0]);
function handleClick(sortKey: keyof T) {
setSortedData(SortByKey({ data, sortKey }));
}
useEffect(() => {
console.log(sortedData);
}, [sortedData]);
return (
<div>
{sortKeys.map((sortKey) => {
return (
<button key={sortKey} onClick={() => handleClick(sortKey)}>
{sortKey}
</button>
);
})}
</div>
);
}
解决方案
用 替换object
“App<T extends object>” Record<string, any>
,即:
export default function App<T extends Record<string, any>>({ data }: { data: T[] }) {
这将使handleClick
button.onClick 停止抛出错误。
为什么:因为当你请求 的键时object
,它们默认是空的,也没有索引签名。
推荐阅读
- r - 使用 dplyr::mutate(across()) 将多列应用于自定义函数
- r - 如何在 R 数据表中查找特定索引?
- html - 如何实现这种将 H2 变成菜单的设计?
- sql - 将事件表中的数据与事件发生之前更改日志表中的最新数据连接起来
- sockets - redis pub/sub 是套接字的替代品吗?
- xml - 如果子节点包含特定字符串,则删除 XML 节点
- javascript - 刷新前发送api调用
- android - @Preview 不起作用 - Jetpack Compose 1.0.0-alpha02
- c - 在链表后面插入值
- python - 如何将 Python pandas 转换为 Julia DataFrame(使用 PyJulia)并返回 Python Pandas