0.1.16 (#16)
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/16
This commit was merged in pull request #16.
This commit is contained in:
Julien Valverdé
2024-03-23 00:51:27 +01:00
parent 82627c88f6
commit e2fbc1558a
5 changed files with 50 additions and 7 deletions

View File

@@ -1,4 +1,4 @@
import { AbstractClass, Simplify } from "type-fest"
import { AbstractClass, Class, Simplify } from "type-fest"
import { Trait } from "./Trait"
import { TraitExpression } from "./TraitExpression"
import { Extend, StaticMembers } from "./util"
@@ -128,6 +128,40 @@ export type ImplStatic<
>
)
export function implStaticThis<
ImplClass extends AbstractClass<object> & { readonly [implSuperSymbol]: true },
This extends AbstractClass<object>,
>(
_Impl: ImplClass,
thisArg: This,
) {
return thisArg as unknown as (
AbstractClass<
InstanceType<ImplClass> & InstanceType<This>,
ConstructorParameters<This>
> &
ImplStatic<ImplClass> &
StaticMembers<This>
)
}
export function implStaticInstantiableThis<
ImplClass extends AbstractClass<object> & { readonly [implSuperSymbol]: true },
This extends Class<object>,
>(
_Impl: ImplClass,
thisArg: This,
) {
return thisArg as unknown as (
Class<
InstanceType<ImplClass> & InstanceType<This>,
ConstructorParameters<This>
> &
ImplStatic<ImplClass> &
StaticMembers<This>
)
}
export const trait = new TraitBuilder(
new TraitExpression(TraitExpression.NullSuperclass, []),

View File

@@ -1,4 +1,4 @@
export { Trait, TraitClass, TraitConcreteClass, TraitInstance, TraitStaticMembers, TraitTuple } from "./Trait"
export { ImplStatic, TraitBuilder, trait } from "./TraitBuilder"
export { ImplStatic, TraitBuilder, implStaticInstantiableThis, implStaticThis, trait } from "./TraitBuilder"
export { Implements, StaticImplements, TraitExpression, TraitExpressionClass, TraitExpressionConcreteClass, TraitExpressionInstance, TraitExpressionStaticMembers } from "./TraitExpression"
export { TraitExpressionBuilder, expression } from "./TraitExpressionBuilder"

View File

@@ -28,6 +28,15 @@ const Identifiable = <ID>() => trait
})
.build()
const ImplementsIdentifiable = <ID>(defaultID: ID) => expression
.expresses(Identifiable<ID>())
.build()
.subtrait()
.implement(Super => class ImplementsIdentifiable extends Super {
readonly id = defaultID
})
.build()
const StatefulSubscription = trait
.abstract(Super => class extends Super {
declare readonly isStatefulSubscription: true