TypeScript出现Is not assignable错误:使用泛型实现MUI表格排序异常
错误原因
TS2345报错的核心是你定义的Bob是固定属性的类型/接口,没有声明动态索引签名,而原getComparator函数的返回值默认要求入参为带动态索引的对象结构,二者类型不兼容。
最优解决方案
修改getComparator的泛型定义,新增目标对象类型的泛型约束,让比较器直接适配业务类型,无需修改原有Bob定义:
function descendingComparator<T>(a: T, b: T, orderBy: keyof T) { if (b[orderBy] < a[orderBy]) { return -1; } if (b[orderBy] > a[orderBy]) { return 1; } return 0; } type Order = 'asc' | 'desc'; // 改动点:新增泛型T约束对象类型,Key约束为T的自有属性 function getComparator<T, Key extends keyof T>( order: Order, orderBy: Key, ): (a: T, b: T) => number { return order === 'desc' ? (a, b) => descendingComparator(a, b, orderBy) : (a, b) => -descendingComparator(a, b, orderBy); }
调用时TS可自动推导泛型,直接使用即可:
rows.slice().sort(getComparator(order, orderBy))
兜底解决方案
如果不想改动工具函数定义,可以给Bob类型新增字符串索引签名:
interface Bob { // 保留你原有所有属性定义 id: number; name: string; // 新增索引签名适配原工具函数要求 [key: string]: string | number | Date; }
内容的提问来源于stack exchange,提问作者Aaron
相关产品推荐
相关产品推荐

