From 5690f75cdf3152d3a1601015b3889e741ca18f3a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Valverd=C3=A9?= Date: Mon, 29 Jul 2024 20:32:39 +0200 Subject: [PATCH] Extend --- src/Types/CommonKeys.ts | 2 +- src/Types/Extend.ts | 83 +++++++++++++++++------------------------ src/Types/Merge.ts | 15 ++++++++ src/Types/index.ts | 2 + src/tests.ts | 14 +++++++ 5 files changed, 66 insertions(+), 50 deletions(-) create mode 100644 src/Types/Merge.ts diff --git a/src/Types/CommonKeys.ts b/src/Types/CommonKeys.ts index 0e24051..fc3bef7 100644 --- a/src/Types/CommonKeys.ts +++ b/src/Types/CommonKeys.ts @@ -1,4 +1,4 @@ /** * Extracts the common keys between two types */ -export type CommonKeys2 = Extract +export type CommonKeys = Extract diff --git a/src/Types/Extend.ts b/src/Types/Extend.ts index 0adcd4f..7a9d2cc 100644 --- a/src/Types/Extend.ts +++ b/src/Types/Extend.ts @@ -1,69 +1,54 @@ -import type { CommonKeys2 } from "./CommonKeys" +import type { CommonKeys } from "./CommonKeys" -export type Extend = ( +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[], ] - ? Pick> extends Pick> - ? Extend> & Self, - ...Rest, - ]> + ? Extendable extends true + ? ExtendAll, ...Rest]> : never : T extends readonly [infer Self] ? Self : {} -) -export type Extend2 = Omit> & Self - - -export type Override = ( +export type ExtendableAll = T extends readonly [ infer Super, infer Self, ...infer Rest extends readonly object[], ] - ? Override> & Self, - ...Rest, - ]> - : T extends readonly [infer Self] - ? Self - : {} -) - -export type Extendable = ( - T extends readonly [ - infer Super, - infer Self, - ...infer Rest extends readonly object[], - ] - ? Pick> extends Pick> - ? Extendable> & Self, - ...Rest, - ]> + ? 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 -) +// 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 e067388..78e48e0 100644 --- a/src/Types/index.ts +++ b/src/Types/index.ts @@ -1,2 +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", {