0.1.0 #1
17
src/Trait.ts
17
src/Trait.ts
@@ -28,18 +28,27 @@ type RemoveAbstractFromImplClass<
|
|||||||
|
|
||||||
|
|
||||||
export class Trait<
|
export class Trait<
|
||||||
Super extends TraitExpression<typeof TraitExpressionNullSuperclass, Trait<any, any, any>[], Trait<any, any, any>[]>,
|
Supertraits extends TraitExpression<typeof TraitExpressionNullSuperclass, Trait<any, any, any>[], Trait<any, any, any>[]>,
|
||||||
Abstract extends {},
|
Abstract extends {},
|
||||||
ImplClass extends Class<{}, []>,
|
ImplClass extends Class<{}, []>,
|
||||||
> {
|
> {
|
||||||
constructor(
|
constructor(
|
||||||
readonly supertraits: Super,
|
readonly supertraits: Supertraits,
|
||||||
readonly abstract: Abstract,
|
readonly abstract: Abstract,
|
||||||
readonly apply: (Super: AbstractClass<{}>) => ImplClass,
|
readonly apply: (Super: AbstractClass<{}>) => ImplClass,
|
||||||
) {}
|
) {}
|
||||||
}
|
}
|
||||||
|
|
||||||
export namespace Trait {
|
export namespace Trait {
|
||||||
|
export type OwnSupertraits<T> = (
|
||||||
|
T extends Trait<infer Supertraits, any, any>
|
||||||
|
? Supertraits
|
||||||
|
: never
|
||||||
|
)
|
||||||
|
export interface OwnSupertraitsFn extends Fn {
|
||||||
|
return: Trait.OwnSupertraits<this["arg0"]>
|
||||||
|
}
|
||||||
|
|
||||||
export type OwnAbstract<T> = (
|
export type OwnAbstract<T> = (
|
||||||
T extends Trait<any, infer Abstract, any>
|
T extends Trait<any, infer Abstract, any>
|
||||||
? Abstract
|
? Abstract
|
||||||
@@ -88,8 +97,8 @@ export namespace Trait {
|
|||||||
}
|
}
|
||||||
|
|
||||||
export type Supertraits<T> = (
|
export type Supertraits<T> = (
|
||||||
T extends Trait<infer Super, any, any>
|
T extends Trait<infer Supertraits, any, any>
|
||||||
? TraitExpression.AllTraits<Super>
|
? TraitExpression.AllTraits<Supertraits>
|
||||||
: never
|
: never
|
||||||
)
|
)
|
||||||
export interface SupertraitsFn extends Fn {
|
export interface SupertraitsFn extends Fn {
|
||||||
|
|||||||
@@ -73,40 +73,36 @@ type SpreadSupertraits<Traits extends Trait<any, any, any>[]> = (
|
|||||||
>
|
>
|
||||||
)
|
)
|
||||||
interface PrependTraitSupertraitsFn extends Fn {
|
interface PrependTraitSupertraitsFn extends Fn {
|
||||||
return: this["arg0"] extends Trait<infer Super, any, any>
|
return: [...Trait.Supertraits<this["arg0"]>, this["arg0"]]
|
||||||
? Super extends TraitExpression<any, any, infer AllTraits>
|
|
||||||
? [...AllTraits, this["arg0"]]
|
|
||||||
: never
|
|
||||||
: never
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
type AbstractMembersExtendable<
|
type AbstractMembersExtendable<
|
||||||
Super extends AbstractClass<{}>,
|
Superclass extends AbstractClass<{}>,
|
||||||
Traits extends Trait<any, any, any>[],
|
Traits extends Trait<any, any, any>[],
|
||||||
> = (
|
> = (
|
||||||
Call<ExtendableFn, [
|
Call<ExtendableFn, [
|
||||||
InstanceType<Super>,
|
InstanceType<Superclass>,
|
||||||
...Call<Tuples.Map<Trait.OwnAbstractFn>, Traits>,
|
...Call<Tuples.Map<Trait.OwnAbstractFn>, Traits>,
|
||||||
]>
|
]>
|
||||||
)
|
)
|
||||||
|
|
||||||
type ImplInstanceExtendable<
|
type ImplInstanceExtendable<
|
||||||
Super extends AbstractClass<{}>,
|
Superclass extends AbstractClass<{}>,
|
||||||
Traits extends Trait<any, any, any>[],
|
Traits extends Trait<any, any, any>[],
|
||||||
> = (
|
> = (
|
||||||
Call<ExtendableFn, [
|
Call<ExtendableFn, [
|
||||||
InstanceType<Super>,
|
InstanceType<Superclass>,
|
||||||
...Call<Tuples.Map<Trait.OwnImplInstanceFn>, Traits>,
|
...Call<Tuples.Map<Trait.OwnImplInstanceFn>, Traits>,
|
||||||
]>
|
]>
|
||||||
)
|
)
|
||||||
|
|
||||||
type ImplStaticMembersExtendable<
|
type ImplStaticMembersExtendable<
|
||||||
Super extends AbstractClass<{}>,
|
Superclass extends AbstractClass<{}>,
|
||||||
Traits extends Trait<any, any, any>[],
|
Traits extends Trait<any, any, any>[],
|
||||||
> = (
|
> = (
|
||||||
Pipe<[
|
Pipe<[
|
||||||
Super,
|
Superclass,
|
||||||
...Call<Tuples.Map<Trait.OwnImplClassFn>, Traits>,
|
...Call<Tuples.Map<Trait.OwnImplClassFn>, Traits>,
|
||||||
], [
|
], [
|
||||||
Tuples.Map<StaticMembersFn>,
|
Tuples.Map<StaticMembersFn>,
|
||||||
@@ -115,19 +111,19 @@ type ImplStaticMembersExtendable<
|
|||||||
)
|
)
|
||||||
|
|
||||||
type GetTraitExpression<
|
type GetTraitExpression<
|
||||||
Super extends AbstractClass<{}>,
|
Superclass extends AbstractClass<{}>,
|
||||||
OwnTraits extends Trait<any, any, any>[],
|
OwnTraits extends Trait<any, any, any>[],
|
||||||
AllTraits extends Trait<any, any, any>[],
|
AllTraits extends Trait<any, any, any>[],
|
||||||
> = (
|
> = (
|
||||||
Call<Tuples.IsEmpty, AllTraits> extends true
|
Call<Tuples.IsEmpty, AllTraits> extends true
|
||||||
? "Cannot express an empty list of traits."
|
? "Cannot express an empty list of traits."
|
||||||
: AbstractMembersExtendable<Super, AllTraits> extends false
|
: AbstractMembersExtendable<Superclass, AllTraits> extends false
|
||||||
? "Type conflict between the traits abstract members and/or the superclass instance."
|
? "Type conflict between the traits abstract members and/or the superclass instance."
|
||||||
: ImplInstanceExtendable<Super, AllTraits> extends false
|
: ImplInstanceExtendable<Superclass, AllTraits> extends false
|
||||||
? "Type conflict between the traits implementation instances and/or the superclass instance."
|
? "Type conflict between the traits implementation instances and/or the superclass instance."
|
||||||
: ImplStaticMembersExtendable<Super, AllTraits> extends false
|
: ImplStaticMembersExtendable<Superclass, AllTraits> extends false
|
||||||
? "Type conflict between the traits implementation static members and/or the superclass static members."
|
? "Type conflict between the traits implementation static members and/or the superclass static members."
|
||||||
: TraitExpression<Super, OwnTraits, AllTraits>
|
: TraitExpression<Superclass, OwnTraits, AllTraits>
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -57,7 +57,7 @@ const builder = expression
|
|||||||
StatefulSubscription,
|
StatefulSubscription,
|
||||||
)
|
)
|
||||||
|
|
||||||
type T = TraitExpression.OwnTraits<typeof builder.expression>
|
type T = TraitExpression.AllTraits<typeof builder.expression>
|
||||||
|
|
||||||
const exp = builder.get()
|
const exp = builder.get()
|
||||||
type Abs = Implements<typeof exp>
|
type Abs = Implements<typeof exp>
|
||||||
|
|||||||
Reference in New Issue
Block a user