From 0cee1dfbd6b60ff80d2ac3cc0612f2753a08ac6c Mon Sep 17 00:00:00 2001 From: syuilo 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 ddcedba94..cc10900e9 100644 --- a/packages/backend/src/services/chart/core.ts +++ b/packages/backend/src/services/chart/core.ts @@ -70,6 +70,18 @@ type ChartResult = { [P in keyof T]: number[]; }; +type UnionToIntersection = (T extends any ? (x: T) => any : never) extends (x: infer R) => any ? R : never; + +type UnflattenSingleton = K extends `${infer A}.${infer B}` + ? { [_ in A]: UnflattenSingleton; } + : { [_ in K]: V; }; + +type Unflatten> = UnionToIntersection< + { + [K in Extract]: UnflattenSingleton; + }[Extract] +>; + /** * 様々なチャートの管理を司るクラス */ @@ -642,12 +654,12 @@ export default abstract class Chart { } @autobind - public async getChart(span: 'hour' | 'day', amount: number, cursor: Date | null, group: string | null = null): Promise> { + public async getChart(span: 'hour' | 'day', amount: number, cursor: Date | null, group: string | null = null): Promise>> { 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>; } }