diff --git a/src/index.ts b/src/index.ts index 8351eca..6524a48 100644 --- a/src/index.ts +++ b/src/index.ts @@ -34,11 +34,16 @@ export type TraitApplier< * Unwraps the type of the class from a given trait. * @template T - The trait type. */ -export type UnwrapTraitC = +export type TraitClass = T extends Trait ? C : never +export type TraitInstance = + T extends Trait + ? InstanceType + : never + /** * Creates a trait using the provided trait applier function. @@ -90,7 +95,7 @@ export type UnwrapTraitC = * trait(Parent => { * abstract class ImplementsIdentifiable extends extendsAndExpresses( * Parent, - * [Identifiable()], + * Identifiable(), * ) { * id: ID = defaultID * @@ -123,7 +128,10 @@ export function trait< * @example * Extends a superclass and applies traits: * ```ts - * class User extends extendsAndExpresses(Entity, [Identifiable(), Permissible]) { + * class User extends extendsAndExpresses(Entity, + * Identifiable(), + * Permissible, + * ) { * readonly id: bigint * * constructor(id: bigint) { @@ -138,7 +146,7 @@ export function extendsAndExpresses< Traits extends readonly Trait[], >( extend: C, - traits: Traits, + ...traits: Traits ) { return traits.reduce( (previous, trait) => trait(previous), @@ -147,10 +155,8 @@ export function extendsAndExpresses< AbstractClass< InstanceType & UnionToIntersection< - InstanceType< - UnwrapTraitC< - Traits[number] - > + TraitInstance< + Traits[number] > >, @@ -160,7 +166,7 @@ export function extendsAndExpresses< StaticMembers & StaticMembers< UnionToIntersection< - UnwrapTraitC< + TraitClass< Traits[number] > > @@ -191,5 +197,5 @@ export function expresses< >( ...traits: Traits ) { - return extendsAndExpresses(Object, traits) + return extendsAndExpresses(Object, ...traits) } diff --git a/src/tests.ts b/src/tests.ts index bb49d1f..6bd14c4 100644 --- a/src/tests.ts +++ b/src/tests.ts @@ -23,7 +23,7 @@ const ImplementsIdentifiable = (defaultID: ID) => trait(Parent => { abstract class ImplementsIdentifiable extends extendsAndExpresses( Parent, - [Identifiable()], + Identifiable(), ) { id: ID = defaultID