55 lines
1.6 KiB
TypeScript
55 lines
1.6 KiB
TypeScript
import type { CommonKeys } from "./CommonKeys"
|
|
|
|
|
|
export type Extend<Super, Self> =
|
|
Extendable<Super, Self> extends true
|
|
? Omit<Super, CommonKeys<Self, Super>> & Self
|
|
: never
|
|
|
|
export type Extendable<Super, Self> =
|
|
Pick<Self, CommonKeys<Self, Super>> extends Pick<Super, CommonKeys<Self, Super>>
|
|
? true
|
|
: false
|
|
|
|
|
|
export type ExtendAll<T extends readonly object[]> =
|
|
T extends readonly [
|
|
infer Super,
|
|
infer Self,
|
|
...infer Rest extends readonly object[],
|
|
]
|
|
? Extendable<Super, Self> extends true
|
|
? ExtendAll<readonly [Extend<Super, Self>, ...Rest]>
|
|
: never
|
|
: T extends readonly [infer Self]
|
|
? Self
|
|
: {}
|
|
|
|
export type ExtendableAll<T extends readonly object[]> =
|
|
T extends readonly [
|
|
infer Super,
|
|
infer Self,
|
|
...infer Rest extends readonly object[],
|
|
]
|
|
? Extendable<Super, Self> extends true
|
|
? ExtendableAll<readonly [Extend<Super, Self>, ...Rest]>
|
|
: false
|
|
: true
|
|
|
|
// export type NonExtendableKeys<T extends readonly object[]> = (
|
|
// 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<readonly [
|
|
// Super & Self,
|
|
// ...Rest,
|
|
// ]>
|
|
// : void
|
|
// )
|