Extend
All checks were successful
Lint / lint (push) Successful in 11s

This commit is contained in:
Julien Valverdé
2024-07-29 19:26:44 +02:00
parent 4366f2af6e
commit fc33429b93
3 changed files with 71 additions and 0 deletions

4
src/Types/CommonKeys.ts Normal file
View File

@@ -0,0 +1,4 @@
/**
* Extracts the common keys between two types
*/
export type CommonKeys<A, B> = Extract<keyof A, keyof B>

66
src/Types/Extend.ts Normal file
View File

@@ -0,0 +1,66 @@
import type { CommonKeys } from "./CommonKeys"
export type Extend<T extends readonly object[]> = (
T extends readonly [
infer Super,
infer Self,
...infer Rest extends readonly object[],
]
? Pick<Self, CommonKeys<Self, Super>> extends Pick<Super, CommonKeys<Self, Super>>
? Extend<readonly [
Omit<Super, CommonKeys<Self, Super>> & Self,
...Rest,
]>
: never
: T extends readonly [infer Self]
? Self
: {}
)
export type Override<T extends readonly object[]> = (
T extends readonly [
infer Super,
infer Self,
...infer Rest extends readonly object[],
]
? Override<readonly [
Omit<Super, CommonKeys<Self, Super>> & Self,
...Rest,
]>
: T extends readonly [infer Self]
? Self
: {}
)
export type Extendable<T extends readonly object[]> = (
T extends readonly [
infer Super,
infer Self,
...infer Rest extends readonly object[],
]
? Pick<Self, CommonKeys<Self, Super>> extends Pick<Super, CommonKeys<Self, Super>>
? Extendable<readonly [
Omit<Super, CommonKeys<Self, 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
)

View File

@@ -1 +1,2 @@
export * from "./CommonKeys"
export * from "./StaticType"