Я пытаюсь превратить функцию сортировки пользовательского интерфейса материала в общий типизированный. Так что я могу использовать его с любым видом стола. Я застрял при использовании функции stableSort
, которая использует функцию getSorting
.
stableSort:
const getSorting = <K extends keyof any>(
order: Order,
orderBy: K,
): (a: { [key in K]: number | string }, b: { [key in K]: number | string }) => number =>
order === "desc" ? (a, b) => desc(a, b, orderBy) : (a, b) => -desc(a, b, orderBy);
getSorting:
const stableSort = <T>(array: T[], cmp: (a: T, b: T) => number): T[] => {
const stabilizedThis = array.map((el, index) => [el, index] as [T, number]);
stabilizedThis.sort((a, b) => {
const order = cmp(a[0], b[0]);
if (order !== 0) return order;
return a[1] - b[1];
});
return stabilizedThis.map((el) => el[0]);
};
И вот как я использую функции,
interface ITableProps<T> {
title: string;
rows: T[];
defaultOrderBy: keyof T;
order: Order;
}
const SomeTable = <T>(props: ITableProps<T>) => {
const rowsPerPage = 10;
const page = 0;
const handleRequestSort = <T>(property: keyof T): void => {
const isDesc = props.defaultOrderBy === property && props.order === "desc";
};
const sortingFunction = getSorting<keyof T>(props.order, props.defaultOrderBy);
const temp = stableSort<T>(props.rows, sortingFunction)
.slice(page * rowsPerPage, page * rowsPerPage + rowsPerPage)
.map((row, index) => createTableRow(row, index))
}
Пара проблем, с которыми я сталкиваюсь,
Я не понимаю, почему он думает, что props.defaultOrderBy === property
всегда будет false
. Я знаю, что оба keyof T
, но это универсальный тип, и их значения не будут одинаковыми. Небольшая репликация этой проблемы на игровой площадке
У меня ошибка компиляции при вызове функции stableSort
. ( Решено , проверьте мой ответ ниже)
Вот ссылка на игровую площадку