diff --git a/src/Primitives.ts b/src/Primitives.ts index 0a04ea9..07aed5d 100644 --- a/src/Primitives.ts +++ b/src/Primitives.ts @@ -1,4 +1,16 @@ /* eslint-disable @typescript-eslint/no-unsafe-function-type */ +type Year = `${number}${number}${number}${number}`; +type Month = `${number}${number}`; +type Day = `${number}${number}`; +type Hour = `${number}${number}`; +type Minute = `${number}${number}`; +type Second = `${number}${number}`; +type Milliseconds = `${number}${number}${number}`; +type Timezone = "Z" | `${"+" | "-"}${number}${number}:${number}${number}`; + +export type ISODateTime = + `${Year}-${Month}-${Day}T${Hour}:${Minute}:${Second}.${Milliseconds}${Timezone}`; + type Methods = { [P in keyof T]: T[P] extends Function ? P : never; }[keyof T]; @@ -9,16 +21,16 @@ type Properties = Omit, Methods>; type PrimitiveTypes = string | number | boolean | undefined | null; -type DateToNumber = T extends Date ? number : T; +type DateToISODateTime = T extends Date ? ISODateTime : T; type ValueObjectValue = T extends PrimitiveTypes ? T : T extends Date - ? number + ? ISODateTime : T extends { value: infer U } - ? DateToNumber + ? DateToISODateTime : T extends Array<{ value: infer U }> - ? DateToNumber[] + ? DateToISODateTime[] : T extends Array ? Array> : T extends { [K in keyof Properties]: unknown } @@ -26,7 +38,7 @@ type ValueObjectValue = T extends PrimitiveTypes [K in keyof Properties]: ValueObjectValue[K]>; } : T extends unknown - ? DateToNumber + ? DateToISODateTime : never; export type Primitives = { diff --git a/tests/Primitives.test.ts b/tests/Primitives.test.ts index aee0448..1a8a464 100644 --- a/tests/Primitives.test.ts +++ b/tests/Primitives.test.ts @@ -1,6 +1,7 @@ import { expectTypeOf } from "expect-type"; import { Primitives } from "../src"; +import { ISODateTime } from "../src/Primitives"; import { Course } from "./Course"; import { DeliveryInfo } from "./DeliveryInfo"; import { Learner } from "./Learner"; @@ -70,12 +71,12 @@ describe("Primitives", () => { expectTypeOf().toEqualTypeOf(); }); - it("should get primitive number type from Date", () => { + it("should get primitive ISO string type from Date", () => { type actualPrimitives = Primitives; type expectedPrimitives = { readonly name: string; - readonly publishedAt: number; + readonly publishedAt: ISODateTime; }; expectTypeOf().toEqualTypeOf();