From 0cee1dfbd6b60ff80d2ac3cc0612f2753a08ac6c Mon Sep 17 00:00:00 2001
From: syuilo <Syuilotan@yahoo.co.jp>
Date: Fri, 18 Feb 2022 22:29:23 +0900
Subject: [PATCH] refactor: better getChart result type

---
 packages/backend/src/services/chart/core.ts | 16 ++++++++++++++--
 1 file changed, 14 insertions(+), 2 deletions(-)

diff --git a/packages/backend/src/services/chart/core.ts b/packages/backend/src/services/chart/core.ts
index ddcedba94b..cc10900e9f 100644
--- a/packages/backend/src/services/chart/core.ts
+++ b/packages/backend/src/services/chart/core.ts
@@ -70,6 +70,18 @@ type ChartResult<T extends Schema> = {
 	[P in keyof T]: number[];
 };
 
+type UnionToIntersection<T> = (T extends any ? (x: T) => any : never) extends (x: infer R) => any ? R : never;
+
+type UnflattenSingleton<K extends string, V> = K extends `${infer A}.${infer B}`
+	? { [_ in A]: UnflattenSingleton<B, V>; }
+	: { [_ in K]: V; };
+
+type Unflatten<T extends Record<string, any>> = UnionToIntersection<
+	{
+		[K in Extract<keyof T, string>]: UnflattenSingleton<K, T[K]>;
+	}[Extract<keyof T, string>]
+>;
+
 /**
  * 様々なチャートの管理を司るクラス
  */
@@ -642,12 +654,12 @@ export default abstract class Chart<T extends Schema> {
 	}
 
 	@autobind
-	public async getChart(span: 'hour' | 'day', amount: number, cursor: Date | null, group: string | null = null): Promise<Record<string, unknown>> {
+	public async getChart(span: 'hour' | 'day', amount: number, cursor: Date | null, group: string | null = null): Promise<Unflatten<ChartResult<T>>> {
 		const result = await this.getChartRaw(span, amount, cursor, group);
 		const object = {};
 		for (const [k, v] of Object.entries(result)) {
 			nestedProperty.set(object, k, v);
 		}
-		return object;
+		return object as Unflatten<ChartResult<T>>;
 	}
 }
-- 
GitLab