ArkarDev

Grouping elements by months in Typescript

Dec 3, 2022Arkar Kaung Myat
Typescript

Typechecking a grouping function

export type Months =
  | "January"
  | "February"
  | "March"
  | "April"
  | "May"
  | "June"
  | "July"
  | "August"
  | "September"
  | "October"
  | "November"
  | "December";

export type accType<T extends { releasedAt: string }> = {
  [key in Months]: T[];
};

function groupByMonth<T extends { releasedAt: string }>(articles: T[]) {
  let grouped = articles.reduce((acc: accType<T>, article) => {
    const month = dateFormat(article.releasedAt, "mmmm") as Months;
    acc[month] = [...(acc[month] || []), article];
    return acc;
  }, {} as accType<T>);
  return grouped;
}

export default groupByMonth;