0.1.12 (#12)
All checks were successful
continuous-integration/drone/push Build is passing

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:
Julien Valverdé
2024-02-25 03:25:55 +01:00
parent 9d15943c98
commit 1ac7ec5245
4 changed files with 29 additions and 29 deletions

View File

@@ -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]>
}

View File

@@ -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,
]>

View File

@@ -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,
]>