/** * Represents the common keys between two types. * @template A - The first type. * @template B - The second type. */ export type CommonKeys = Extract 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 : {} ) /** * Merges an inheritance tree defined by an array of types without allowing overrides. * @template T - An array of types representing the inheritance tree. */ export type ExtendWithoutOverriding = ( T extends [infer Super, infer Self, ...infer Rest] ? Pick> extends Pick> ? ExtendWithoutOverriding<[ Super & Self, ...Rest, ]> : never : T extends [infer Self] ? Self : void )