0.1.0 #1
@@ -5,6 +5,6 @@ export type AbstractTag = "@thilawyn/traitify-ts/Abstract"
|
||||
|
||||
export function abstract<
|
||||
Abstract extends {} = {}
|
||||
>(): Opaque<Abstract, AbstractTag> {
|
||||
return undefined as any
|
||||
>() {
|
||||
return {} as Opaque<Abstract, AbstractTag>
|
||||
}
|
||||
|
||||
23
src/trait.ts
23
src/trait.ts
@@ -28,17 +28,27 @@ type RemoveAbstractFromImpl<
|
||||
|
||||
|
||||
export class Trait<
|
||||
Abstract extends {},
|
||||
Impl extends Class<{}, []>,
|
||||
Abstract extends {},
|
||||
Impl extends Class<{}, []>,
|
||||
Supertraits extends Trait<any, any, any>[]
|
||||
> {
|
||||
constructor(
|
||||
readonly abstract: Abstract,
|
||||
readonly apply: (Super: AbstractClass<{}>) => Impl,
|
||||
readonly supertraits: Supertraits,
|
||||
readonly ownAbstract: Abstract,
|
||||
readonly apply: (Super: AbstractClass<{}>) => Impl,
|
||||
) {}
|
||||
}
|
||||
|
||||
export interface Trait<
|
||||
Abstract extends {},
|
||||
Impl extends Class<{}, []>,
|
||||
Supertraits extends Trait<any, any, any>[]
|
||||
> {
|
||||
get ownImplClass(): Impl
|
||||
}
|
||||
|
||||
export type TraitAbstractMembers<T> = (
|
||||
T extends Trait<infer AbstractMembers, any>
|
||||
T extends Trait<infer AbstractMembers, any, any>
|
||||
? AbstractMembers
|
||||
: never
|
||||
)
|
||||
@@ -48,7 +58,7 @@ export interface TraitAbstractMembersFn extends Fn {
|
||||
}
|
||||
|
||||
export type TraitImplClass<T> = (
|
||||
T extends Trait<any, infer Impl>
|
||||
T extends Trait<any, infer Impl, any>
|
||||
? Impl
|
||||
: never
|
||||
)
|
||||
@@ -102,6 +112,7 @@ export function trait<
|
||||
),
|
||||
) {
|
||||
return new Trait(
|
||||
[] as const,
|
||||
abstract as Abstract,
|
||||
apply as any as (Super: AbstractClass<{}>) => RemoveAbstractFromImpl<ImplWithAbstract, Abstract>,
|
||||
)
|
||||
|
||||
Reference in New Issue
Block a user