This commit is contained in:
26
src/trait.ts
26
src/trait.ts
@@ -1,7 +1,7 @@
|
||||
import { Call, Fn } from "hotscript"
|
||||
import { AbstractClass, Class, Opaque } from "type-fest"
|
||||
import { AbstractTag, NullTraitExpressionSuperclass, TraitExpression } from "."
|
||||
import { StaticMembers } from "./util"
|
||||
import { AbstractTag, TraitExpression, TraitExpressionAbstractFn, TraitExpressionNullSuperclass, TraitExpressionTraitsFn, emptyTraitExpression } from "."
|
||||
import { ExtendFn, StaticMembers } from "./util"
|
||||
|
||||
|
||||
type AddAbstractToImplClass<
|
||||
@@ -28,7 +28,7 @@ type RemoveAbstractFromImplClass<
|
||||
|
||||
|
||||
export class Trait<
|
||||
Super extends TraitExpression<typeof NullTraitExpressionSuperclass, any>[],
|
||||
Super extends TraitExpression<typeof TraitExpressionNullSuperclass, any>,
|
||||
Abstract extends {},
|
||||
ImplClass extends Class<{}, []>,
|
||||
> {
|
||||
@@ -54,7 +54,7 @@ export interface TraitOwnImplClassFn extends Fn {
|
||||
export type TraitOwnImplClass<T> = Call<TraitOwnImplClassFn, T>
|
||||
|
||||
export interface TraitOwnImplInstanceFn extends Fn {
|
||||
return: this["arg0"] extends Trait<any, infer Abstract, infer ImplClass>
|
||||
return: this["arg0"] extends Trait<any, any, infer ImplClass>
|
||||
? InstanceType<ImplClass>
|
||||
: never
|
||||
}
|
||||
@@ -77,6 +77,22 @@ export interface TraitOwnInstanceFn extends Fn {
|
||||
export type TraitOwnInstance<T> = Call<TraitOwnInstanceFn, T>
|
||||
|
||||
|
||||
export interface TraitSupertraitsFn extends Fn {
|
||||
return: this["arg0"] extends Trait<infer Super, any, any>
|
||||
? Call<TraitExpressionTraitsFn, Super>
|
||||
: never
|
||||
}
|
||||
|
||||
export interface TraitAbstractFn extends Fn {
|
||||
return: this["arg0"] extends Trait<infer Super, infer Abstract, any>
|
||||
? Call<ExtendFn, [
|
||||
...Call<TraitExpressionAbstractFn, Super>,
|
||||
Abstract,
|
||||
]>
|
||||
: never
|
||||
}
|
||||
|
||||
|
||||
export type TraitApplierSuperTag = "@thilawyn/traitify-ts/TraitApplierSuper"
|
||||
|
||||
export function trait<
|
||||
@@ -89,7 +105,7 @@ export function trait<
|
||||
),
|
||||
) {
|
||||
return new Trait(
|
||||
[] as const,
|
||||
emptyTraitExpression,
|
||||
abstract as Abstract,
|
||||
apply as any as (Super: AbstractClass<{}>) => RemoveAbstractFromImplClass<ImplClassWithAbstract, Abstract>,
|
||||
)
|
||||
|
||||
Reference in New Issue
Block a user