Co-authored-by: Julien Valverdé <julien.valverde@mailo.com> Reviewed-on: https://git.jvalver.de/Thilawyn/traitify-ts/pulls/12
This commit was merged in pull request #12.
This commit is contained in:
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@thilawyn/traitify-ts",
|
||||
"version": "0.1.11",
|
||||
"version": "0.1.12",
|
||||
"type": "module",
|
||||
"publishConfig": {
|
||||
"registry": "https://git.jvalver.de/api/packages/thilawyn/npm/"
|
||||
|
||||
14
src/Trait.ts
14
src/Trait.ts
@@ -74,43 +74,43 @@ export namespace Trait {
|
||||
|
||||
export namespace TraitTuple {
|
||||
export type MapAbstract<T> = {
|
||||
[K in keyof T]: K extends keyof []
|
||||
[K in keyof T]: K extends keyof readonly []
|
||||
? T[K]
|
||||
: Trait.Abstract<T[K]>
|
||||
}
|
||||
|
||||
export type MapStaticAbstract<T> = {
|
||||
[K in keyof T]: K extends keyof []
|
||||
[K in keyof T]: K extends keyof readonly []
|
||||
? T[K]
|
||||
: Trait.StaticAbstract<T[K]>
|
||||
}
|
||||
|
||||
export type MapImplClass<T> = {
|
||||
[K in keyof T]: K extends keyof []
|
||||
[K in keyof T]: K extends keyof readonly []
|
||||
? T[K]
|
||||
: Trait.ImplClass<T[K]>
|
||||
}
|
||||
|
||||
export type MapImplInstance<T> = {
|
||||
[K in keyof T]: K extends keyof []
|
||||
[K in keyof T]: K extends keyof readonly []
|
||||
? T[K]
|
||||
: Trait.ImplInstance<T[K]>
|
||||
}
|
||||
|
||||
export type MapImplStaticMembers<T> = {
|
||||
[K in keyof T]: K extends keyof []
|
||||
[K in keyof T]: K extends keyof readonly []
|
||||
? T[K]
|
||||
: Trait.ImplStaticMembers<T[K]>
|
||||
}
|
||||
|
||||
export type MapInstance<T> = {
|
||||
[K in keyof T]: K extends keyof []
|
||||
[K in keyof T]: K extends keyof readonly []
|
||||
? T[K]
|
||||
: Trait.Instance<T[K]>
|
||||
}
|
||||
|
||||
export type MapStaticMembers<T> = {
|
||||
[K in keyof T]: K extends keyof []
|
||||
[K in keyof T]: K extends keyof readonly []
|
||||
? T[K]
|
||||
: Trait.Static<T[K]>
|
||||
}
|
||||
|
||||
@@ -33,7 +33,7 @@ export class TraitExpressionBuilder<
|
||||
return traits.flatMap(trait => [
|
||||
...trait.superExpression.traits,
|
||||
trait,
|
||||
]) as TraitExpressionBuilder.SpreadSupertraits<T>
|
||||
]) as readonly Trait<any, any, any, any>[] as TraitExpressionBuilder.SpreadSupertraits<T>
|
||||
}
|
||||
|
||||
static traitsUniq<
|
||||
@@ -49,7 +49,7 @@ export class TraitExpressionBuilder<
|
||||
>(
|
||||
traits: T
|
||||
) {
|
||||
return uniq(traits) as TraitExpressionBuilder.TraitsUniq<T>
|
||||
return uniq(traits) as readonly Trait<any, any, any, any>[] as TraitExpressionBuilder.TraitsUniq<T>
|
||||
}
|
||||
|
||||
|
||||
@@ -142,30 +142,30 @@ export class TraitExpressionBuilder<
|
||||
|
||||
export namespace TraitExpressionBuilder {
|
||||
export type SpreadSupertraits<Traits> = (
|
||||
Traits extends [
|
||||
Traits extends readonly [
|
||||
infer El extends Trait<any, any, any, any>,
|
||||
...infer Rest,
|
||||
]
|
||||
? [
|
||||
? readonly [
|
||||
...Trait.Supertraits<El>,
|
||||
El,
|
||||
...SpreadSupertraits<Rest>,
|
||||
]
|
||||
: []
|
||||
: readonly []
|
||||
)
|
||||
|
||||
export type TraitsUniq<Traits> = (
|
||||
Traits extends [
|
||||
Traits extends readonly [
|
||||
...infer Rest,
|
||||
infer El extends Trait<any, any, any, any>,
|
||||
]
|
||||
? IsTraitInTupleFromRight<Rest, El> extends true
|
||||
? TraitsUniq<Rest>
|
||||
: [...TraitsUniq<Rest>, El]
|
||||
: []
|
||||
: readonly [...TraitsUniq<Rest>, El]
|
||||
: readonly []
|
||||
)
|
||||
type IsTraitInTupleFromRight<Traits, T> = (
|
||||
Traits extends [...infer Rest, infer El]
|
||||
Traits extends readonly [...infer Rest, infer El]
|
||||
? IsEqual<El, T> extends true
|
||||
? true
|
||||
: IsTraitInTupleFromRight<Rest, T>
|
||||
@@ -176,7 +176,7 @@ export namespace TraitExpressionBuilder {
|
||||
Traits extends readonly Trait<any, any, any, any>[],
|
||||
T extends readonly Trait<any, any, any, any>[],
|
||||
> = (
|
||||
TraitExpressionBuilder.TraitsUniq<[
|
||||
TraitExpressionBuilder.TraitsUniq<readonly [
|
||||
...Traits,
|
||||
...TraitExpressionBuilder.SpreadSupertraits<T>,
|
||||
]>
|
||||
@@ -186,7 +186,7 @@ export namespace TraitExpressionBuilder {
|
||||
Traits extends readonly Trait<any, any, any, any>[],
|
||||
T extends readonly Trait<any, any, any, any>[],
|
||||
> = (
|
||||
TraitExpressionBuilder.TraitsUniq<[
|
||||
TraitExpressionBuilder.TraitsUniq<readonly [
|
||||
...TraitExpressionBuilder.SpreadSupertraits<T>,
|
||||
...Traits,
|
||||
]>
|
||||
|
||||
@@ -22,30 +22,30 @@ import { CommonKeys } from "."
|
||||
|
||||
// TODO: use OverrideProperties from type-fest?
|
||||
export type Extend<T extends readonly object[]> = (
|
||||
T extends [
|
||||
T extends readonly [
|
||||
infer Super,
|
||||
infer Self,
|
||||
...infer Rest extends object[],
|
||||
...infer Rest extends readonly object[],
|
||||
]
|
||||
? Pick<Self, CommonKeys<Self, Super>> extends Pick<Super, CommonKeys<Self, Super>>
|
||||
? Extend<[
|
||||
? Extend<readonly [
|
||||
Omit<Super, CommonKeys<Self, Super>> & Self,
|
||||
...Rest,
|
||||
]>
|
||||
: never
|
||||
: T extends [infer Self]
|
||||
: T extends readonly [infer Self]
|
||||
? Self
|
||||
: {}
|
||||
)
|
||||
|
||||
export type Extendable<T extends readonly object[]> = (
|
||||
T extends [
|
||||
T extends readonly [
|
||||
infer Super,
|
||||
infer Self,
|
||||
...infer Rest extends object[],
|
||||
...infer Rest extends readonly object[],
|
||||
]
|
||||
? Pick<Self, CommonKeys<Self, Super>> extends Pick<Super, CommonKeys<Self, Super>>
|
||||
? Extendable<[
|
||||
? Extendable<readonly [
|
||||
Omit<Super, CommonKeys<Self, Super>> & Self,
|
||||
...Rest,
|
||||
]>
|
||||
@@ -54,16 +54,16 @@ export type Extendable<T extends readonly object[]> = (
|
||||
)
|
||||
|
||||
export type NonExtendableKeys<T extends readonly object[]> = (
|
||||
T extends [
|
||||
T extends readonly [
|
||||
infer Super extends object,
|
||||
infer Self extends object,
|
||||
...infer Rest 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<[
|
||||
| NonExtendableKeys<readonly [
|
||||
Super & Self,
|
||||
...Rest,
|
||||
]>
|
||||
|
||||
Reference in New Issue
Block a user