diff --git a/src/traits.ts b/src/traits.ts index 5e4a520..20b0386 100644 --- a/src/traits.ts +++ b/src/traits.ts @@ -101,6 +101,33 @@ export type Trait< superTraits: ST } +type ResolveTraitLike> = + T extends TypeFactory + ? ExtractFactory> + : T extends Trait + ? ExtractFactory + : unknown; + +type Combine = + T extends [infer Head, ...infer Tail] + ? Head & Combine + : {}; + +type MapClassesToPrototypes any) & {prototype: any}>> = { + [K in keyof T]: T[K]['prototype']; +} + +type MapClassesToInstances any) & {prototype: any}>> = { + [K in keyof T]: InstanceType; +} + +type CombineClasses any) & {prototype: any}>> = + (new () => Combine>) & {prototype: Combine>}; + +type ResolveTraitLikeArray>> = CombineClasses<{ + [K in keyof T]: ResolveTraitLike; +}>; + /* API: generate trait (regular variant) */ /* eslint no-redeclare: off */ export function trait< @@ -110,28 +137,13 @@ export function trait< /* API: generate trait (super-trait variant) */ export function trait< const ST extends (Trait | TypeFactory)[], - T extends ConsFactory ? ExtractFactory> : - First extends Trait ? ExtractFactory : - any - ) : any - > + T extends ConsFactory> > (superTraits: ST, factory: T): Trait /* API: generate trait (technical implementation) */ -export function trait< - const ST extends (Trait | TypeFactory)[], - T extends ConsFactory ? ExtractFactory> : - First extends Trait ? ExtractFactory : - any - ) : any - > -> (...args: any[]): Trait { - const factory: T = (args.length === 2 ? args[1] : args[0]) - const superTraits: ST = (args.length === 2 ? args[0] : undefined) +export function trait(...args: any[]): Trait { + const factory: ConsFactory = (args.length === 2 ? args[1] : args[0]) + const superTraits: (Trait | TypeFactory)[] = (args.length === 2 ? args[0] : undefined) return { id: crc32(factory.toString()), symbol: Symbol("trait"), @@ -405,7 +417,7 @@ type DerivedType = InstanceType> /* internal type: implements trait type or trait type factory */ -type Derived | Cons)> = +export type Derived | Cons)> = T extends TypeFactory ? DerivedType> : T extends Trait ? DerivedType : T extends Cons ? T :