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..3cc12da --- /dev/null +++ b/src/Types/Extend.ts @@ -0,0 +1,66 @@ +import type { CommonKeys } from "./CommonKeys" + + +export type Extend = ( + T extends readonly [ + infer Super, + infer Self, + ...infer Rest extends readonly object[], + ] + ? Pick> extends Pick> + ? Extend> & Self, + ...Rest, + ]> + : never + : T extends readonly [infer Self] + ? Self + : {} +) + +export type Override = ( + 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, + ]> + : 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/index.ts b/src/Types/index.ts index fc3cf1c..e067388 100644 --- a/src/Types/index.ts +++ b/src/Types/index.ts @@ -1 +1,2 @@ +export * from "./CommonKeys" export * from "./StaticType"