diff --git a/src/tests.ts b/src/tests.ts index e1f29af..b0abcf5 100644 --- a/src/tests.ts +++ b/src/tests.ts @@ -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 => diff --git a/src/trait.ts b/src/trait.ts index 46fddb8..c300475 100644 --- a/src/trait.ts +++ b/src/trait.ts @@ -13,12 +13,23 @@ type AddAbstractMembersToImpl< StaticMembers ) +type RemoveAbstractMembersFromImplInstance< + ImplInstanceWithAbstractMembers extends AbstractMembers, + AbstractMembers extends object, +> = ( + Omit +) + type RemoveAbstractMembersFromImpl< ImplWithAbstractMembers extends Class, AbstractMembers extends object, > = ( Class< - Omit, keyof AbstractMembers>, + RemoveAbstractMembersFromImplInstance< + InstanceType, + AbstractMembers + >, + ConstructorParameters > & StaticMembers @@ -28,16 +39,13 @@ type RemoveAbstractMembersFromImpl< export type TraitTag = "@thilawyn/traitify-ts/Trait" export type Trait< - AbstractMembers extends object, - Impl extends Class, + AbstractMembers extends object, + ImplWithAbstractMembers extends Class, > = ( Opaque<{ readonly apply: TraitApplier< AbstractMembers, - AddAbstractMembersToImpl< - Impl, - AbstractMembers - > + ImplWithAbstractMembers > }, TraitTag> ) @@ -48,27 +56,33 @@ export type TraitAbstractMembers = ( : never ) -export type TraitImpl = ( - T extends Trait - ? Impl +export type TraitImplClass = ( + T extends Trait + ? RemoveAbstractMembersFromImpl< + ImplWithAbstractMembers, + AbstractMembers + > : never ) export type TraitImplInstance = ( - T extends Trait - ? InstanceType + T extends Trait + ? RemoveAbstractMembersFromImplInstance< + InstanceType, + AbstractMembers + > : never ) export type TraitClass = ( - T extends Trait - ? AddAbstractMembersToImpl + T extends Trait + ? ImplWithAbstractMembers : never ) export type TraitInstance = ( - T extends Trait - ? InstanceType & AbstractMembers + T extends Trait + ? InstanceType : never ) @@ -91,10 +105,7 @@ export function trait< apply: TraitApplier ) => Trait< AbstractMembers, - RemoveAbstractMembersFromImpl< - ImplWithAbstractMembers, - AbstractMembers - > + ImplWithAbstractMembers > ) { return apply => ({ apply }) as any