You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.02 13:24:03