0.1.0 #1

Merged
Thilawyn merged 65 commits from next into master 2024-02-06 03:15:40 +01:00
2 changed files with 32 additions and 21 deletions
Showing only changes of commit 3aade48a7d - Show all commits

View File

@@ -1,5 +1,5 @@
import { Simplify } from "type-fest"
import { TraitAbstractMembers, TraitClass, TraitImpl, TraitImplInstance, TraitInstance, expresses, trait } from "."
import { TraitImplInstance, expresses, trait } from "."
const PrintsHelloOnNew = trait()(Super =>

View File

@@ -13,12 +13,23 @@ type AddAbstractMembersToImpl<
StaticMembers<Impl>
)
type RemoveAbstractMembersFromImplInstance<
ImplInstanceWithAbstractMembers extends AbstractMembers,
AbstractMembers extends object,
> = (
Omit<ImplInstanceWithAbstractMembers, keyof AbstractMembers>
)
type RemoveAbstractMembersFromImpl<
ImplWithAbstractMembers extends Class<AbstractMembers, []>,
AbstractMembers extends object,
> = (
Class<
Omit<InstanceType<ImplWithAbstractMembers>, keyof AbstractMembers>,
RemoveAbstractMembersFromImplInstance<
InstanceType<ImplWithAbstractMembers>,
AbstractMembers
>,
ConstructorParameters<ImplWithAbstractMembers>
> &
StaticMembers<ImplWithAbstractMembers>
@@ -28,16 +39,13 @@ type RemoveAbstractMembersFromImpl<
export type TraitTag = "@thilawyn/traitify-ts/Trait"
export type Trait<
AbstractMembers extends object,
Impl extends Class<object, []>,
AbstractMembers extends object,
ImplWithAbstractMembers extends Class<AbstractMembers, []>,
> = (
Opaque<{
readonly apply: TraitApplier<
AbstractMembers,
AddAbstractMembersToImpl<
Impl,
AbstractMembers
>
ImplWithAbstractMembers
>
}, TraitTag>
)
@@ -48,27 +56,33 @@ export type TraitAbstractMembers<T> = (
: never
)
export type TraitImpl<T> = (
T extends Trait<any, infer Impl>
? Impl
export type TraitImplClass<T> = (
T extends Trait<infer AbstractMembers, infer ImplWithAbstractMembers>
? RemoveAbstractMembersFromImpl<
ImplWithAbstractMembers,
AbstractMembers
>
: never
)
export type TraitImplInstance<T> = (
T extends Trait<any, infer Impl>
? InstanceType<Impl>
T extends Trait<infer AbstractMembers, infer ImplWithAbstractMembers>
? RemoveAbstractMembersFromImplInstance<
InstanceType<ImplWithAbstractMembers>,
AbstractMembers
>
: never
)
export type TraitClass<T> = (
T extends Trait<infer AbstractMembers, infer Impl>
? AddAbstractMembersToImpl<Impl, AbstractMembers>
T extends Trait<any, infer ImplWithAbstractMembers>
? ImplWithAbstractMembers
: never
)
export type TraitInstance<T> = (
T extends Trait<infer AbstractMembers, infer Impl>
? InstanceType<Impl> & AbstractMembers
T extends Trait<any, infer ImplWithAbstractMembers>
? InstanceType<ImplWithAbstractMembers>
: never
)
@@ -91,10 +105,7 @@ export function trait<
apply: TraitApplier<AbstractMembers, ImplWithAbstractMembers>
) => Trait<
AbstractMembers,
RemoveAbstractMembersFromImpl<
ImplWithAbstractMembers,
AbstractMembers
>
ImplWithAbstractMembers
>
) {
return apply => ({ apply }) as any