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 { Simplify } from "type-fest"
import { TraitAbstractMembers, TraitClass, TraitImpl, TraitImplInstance, TraitInstance, expresses, trait } from "." import { TraitImplInstance, expresses, trait } from "."
const PrintsHelloOnNew = trait()(Super => const PrintsHelloOnNew = trait()(Super =>

View File

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