При разработке решений может возникнуть необходимость группировки массива элементов по ключу/ключам.
В данном случае рассматривается типизированный метод groupBy под тип элемента приложения.
Тип OmitAny используется для исключения any из системного типа ItemData, чтобы достичь строгой типизации ключа типа элемента приложения.
Код:
type OmitAny<T> = {
[K in keyof T as 0 extends (1 & T[K]) ? never : K]: T[K]
}
function groupBy<D extends ItemData, P extends ItemData>(items: ApplicationItem<D, P>[], key: keyof OmitAny<D>): { [key: string]: ApplicationItem<D, P>[] } {
return items.reduce(function (result, item) {
const result_key = item.data[key].id;
if (!result[result_key]) {
result[result_key] = [];
}
result[result_key].push(item);
return result;
}, {});
}
Пример проверки типа.