From 94f16a396762d1bcb05e7bc86fdf610bd995dfe8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Valverd=C3=A9?= Date: Mon, 29 Jul 2024 20:35:42 +0200 Subject: [PATCH] 0.1.8 (#9) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Julien Valverdé Reviewed-on: https://git.valverde.cloud/Thilawyn/thilalib/pulls/9 --- package.json | 2 +- src/Types/CommonKeys.ts | 4 +++ src/Types/Extend.ts | 54 +++++++++++++++++++++++++++++++++++++++++ src/Types/Merge.ts | 15 ++++++++++++ src/Types/index.ts | 3 +++ src/tests.ts | 14 +++++++++++ 6 files changed, 91 insertions(+), 1 deletion(-) create mode 100644 src/Types/CommonKeys.ts create mode 100644 src/Types/Extend.ts create mode 100644 src/Types/Merge.ts diff --git a/package.json b/package.json index 2b9cd8e..777cd5e 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@thilawyn/thilalib", - "version": "0.1.7", + "version": "0.1.8", "type": "module", "files": [ "./dist" diff --git a/src/Types/CommonKeys.ts b/src/Types/CommonKeys.ts new file mode 100644 index 0000000..fc3bef7 --- /dev/null +++ b/src/Types/CommonKeys.ts @@ -0,0 +1,4 @@ +/** + * Extracts the common keys between two types + */ +export type CommonKeys = Extract diff --git a/src/Types/Extend.ts b/src/Types/Extend.ts new file mode 100644 index 0000000..7a9d2cc --- /dev/null +++ b/src/Types/Extend.ts @@ -0,0 +1,54 @@ +import type { CommonKeys } from "./CommonKeys" + + +export type Extend = + Extendable extends true + ? Omit> & Self + : never + +export type Extendable = + Pick> extends Pick> + ? true + : false + + +export type ExtendAll = + T extends readonly [ + infer Super, + infer Self, + ...infer Rest extends readonly object[], + ] + ? Extendable extends true + ? ExtendAll, ...Rest]> + : never + : T extends readonly [infer Self] + ? Self + : {} + +export type ExtendableAll = + T extends readonly [ + infer Super, + infer Self, + ...infer Rest extends readonly object[], + ] + ? Extendable extends true + ? ExtendableAll, ...Rest]> + : false + : true + +// export type NonExtendableKeys = ( +// T extends readonly [ +// infer Super extends object, +// infer Self extends object, +// ...infer Rest extends readonly object[], +// ] +// ? {[K in keyof Super & keyof Self]: Self[K] extends Super[K] +// ? never +// : K +// }[keyof Super & keyof Self] +// | NonExtendableKeys +// : void +// ) diff --git a/src/Types/Merge.ts b/src/Types/Merge.ts new file mode 100644 index 0000000..b38c174 --- /dev/null +++ b/src/Types/Merge.ts @@ -0,0 +1,15 @@ +import type { CommonKeys } from "./CommonKeys" + + +export type Merge = Omit> & Self + +export type MergeAll = + T extends readonly [ + infer Super, + infer Self, + ...infer Rest extends readonly object[], + ] + ? MergeAll, ...Rest]> + : T extends readonly [infer Self] + ? Self + : {} diff --git a/src/Types/index.ts b/src/Types/index.ts index fc3cf1c..78e48e0 100644 --- a/src/Types/index.ts +++ b/src/Types/index.ts @@ -1 +1,4 @@ +export * from "./CommonKeys" +export * from "./Extend" +export * from "./Merge" export * from "./StaticType" diff --git a/src/tests.ts b/src/tests.ts index b61ccba..764e0f2 100644 --- a/src/tests.ts +++ b/src/tests.ts @@ -1,7 +1,21 @@ import { Schema as S } from "@effect/schema" import { reaction, runInAction } from "mobx" +import type { Simplify } from "type-fest" import { Jsonifiable, MutableTaggedClass } from "./Schema" import { ObservableClass } from "./Schema/MobX" +import type { ExtendAll } from "./Types" + + +type TestA = { + heugneu: string + type: "Type1" | "Type2" +} + +type TestB = { + type: "Type1" +} + +type Merged = Simplify> class User extends MutableTaggedClass()("User", {