diff --git a/src/tests.ts b/src/tests.ts index c8b2aeb..cc7f851 100644 --- a/src/tests.ts +++ b/src/tests.ts @@ -54,6 +54,7 @@ const builder = expression ) const exp = builder.get() +type Abs = Implements class User extends exp.extends implements Implements { id: bigint = -1n diff --git a/src/trait.ts b/src/trait.ts index df897c3..37951c2 100644 --- a/src/trait.ts +++ b/src/trait.ts @@ -3,30 +3,30 @@ import { AbstractClass, Class, Opaque } from "type-fest" import { StaticMembers } from "./util" -// type AddAbstractMembersToImpl< -// Impl extends Class, -// AbstractMembers extends object, -// > = ( -// Class< -// InstanceType & AbstractMembers, -// ConstructorParameters -// > & -// StaticMembers -// ) +type AddAbstractToImplClass< + Impl extends Class, + Abstract extends object, +> = ( + Class< + InstanceType & Abstract, + ConstructorParameters + > & + StaticMembers +) -type RemoveAbstractMembersFromImplInstance< +type RemoveAbstractFromImplInstance< ImplInstanceWithAbstractMembers extends AbstractMembers, AbstractMembers extends object, > = ( Omit ) -type RemoveAbstractMembersFromImplClass< +type RemoveAbstractFromImplClass< ImplWithAbstractMembers extends Class, AbstractMembers extends object, > = ( Class< - RemoveAbstractMembersFromImplInstance< + RemoveAbstractFromImplInstance< InstanceType, AbstractMembers >, @@ -40,13 +40,13 @@ type RemoveAbstractMembersFromImplClass< export type TraitTag = "@thilawyn/traitify-ts/Trait" export type Trait< - AbstractMembers extends object, - ImplWithAbstractMembers extends Class, + Abstract extends object, + Impl extends Class, > = ( Opaque<{ readonly apply: TraitApplier< - AbstractMembers, - ImplWithAbstractMembers + Abstract, + AddAbstractToImplClass > }, TraitTag> ) @@ -62,11 +62,8 @@ export interface TraitAbstractMembersFn extends Fn { } export type TraitImplClass = ( - T extends Trait - ? RemoveAbstractMembersFromImplClass< - ImplWithAbstractMembers, - AbstractMembers - > + T extends Trait + ? Impl : never ) @@ -75,11 +72,8 @@ export interface TraitImplClassFn extends Fn { } export type TraitImplInstance = ( - T extends Trait - ? RemoveAbstractMembersFromImplInstance< - InstanceType, - AbstractMembers - > + T extends Trait + ? InstanceType : never ) @@ -88,8 +82,8 @@ export interface TraitImplInstanceFn extends Fn { } export type TraitClass = ( - T extends Trait - ? ImplWithAbstractMembers + T extends Trait + ? AddAbstractToImplClass : never ) @@ -98,8 +92,10 @@ export interface TraitClassFn extends Fn { } export type TraitInstance = ( - T extends Trait - ? InstanceType + T extends Trait + ? InstanceType< + AddAbstractToImplClass + > : never ) @@ -111,22 +107,22 @@ export interface TraitInstanceFn extends Fn { export type TraitApplierSuperTag = "@thilawyn/traitify-ts/TraitApplierSuper" export type TraitApplier< - AbstractMembers extends object, - ImplWithAbstractMembers extends Class, + Abstract extends object, + ImplWithAbstract extends Class, > = ( - (Super: Opaque, TraitApplierSuperTag>) => ( - Opaque + (Super: Opaque, TraitApplierSuperTag>) => ( + Opaque ) ) export function trait< - AbstractMembers extends object = {} + Abstract extends object = {} >(): ( - >( - apply: TraitApplier + >( + apply: TraitApplier ) => Trait< - AbstractMembers, - ImplWithAbstractMembers + Abstract, + RemoveAbstractFromImplClass > ) { return apply => ({ apply }) as any