This commit is contained in:
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