0.1.12 #12

Merged
Thilawyn merged 5 commits from next into master 2024-02-25 03:25:55 +01:00
4 changed files with 29 additions and 29 deletions

View File

@@ -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/"

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