This commit is contained in:
Julien Valverdé
2024-01-29 18:39:20 +01:00
parent 5f0d21d93b
commit e493331ff3
3 changed files with 26 additions and 14 deletions

View File

@@ -1,5 +1,5 @@
import { Simplify } from "type-fest" import { Simplify } from "type-fest"
import { Trait, TraitAbstractMembers, TraitImplInstance, expresses, trait } from "." import { GetTraitAbstractMembers, GetTraitClass, GetTraitImplClass, GetTraitImplInstance, GetTraitInstance, Trait, TraitAbstractMembers, TraitImplInstance, expresses, trait } from "."
import { MergeInheritanceTree, TraitsAbstractMembers } from "./util" import { MergeInheritanceTree, TraitsAbstractMembers } from "./util"
import { Call, Fn, Tuples } from "hotscript" import { Call, Fn, Tuples } from "hotscript"
@@ -41,13 +41,6 @@ const ActiveStatefulSubscription = trait<ActiveStatefulSubscriptionAbstractMembe
class ActiveStatefulSubscription extends Super {} class ActiveStatefulSubscription extends Super {}
) )
interface AbstractMembersOfTrait extends Fn {
return: this["arg0"] extends Trait<infer AbstractMembers, any>
? AbstractMembers
: never
}
// type Test = Simplify<TraitImplInstance<ReturnType<typeof Identifiable<bigint>>>> // type Test = Simplify<TraitImplInstance<ReturnType<typeof Identifiable<bigint>>>>
type Test1 = [ type Test1 = [
TraitAbstractMembers<typeof StatefulSubscription>, TraitAbstractMembers<typeof StatefulSubscription>,
@@ -58,12 +51,10 @@ type Test2 = TraitsAbstractMembers<[
typeof ActiveStatefulSubscription, typeof ActiveStatefulSubscription,
]> ]>
type Test3 = Simplify< type Test3 = Simplify<
MergeInheritanceTree< Call<Tuples.Map<GetTraitClass>, [
Call<Tuples.Map<AbstractMembersOfTrait>, [
typeof StatefulSubscription, typeof StatefulSubscription,
typeof ActiveStatefulSubscription, typeof ActiveStatefulSubscription,
]> ]>
>
> >
// type Test2 = Simplify<MergeInheritanceTree<Test1>> // type Test2 = Simplify<MergeInheritanceTree<Test1>>

View File

@@ -1,3 +1,4 @@
import { Fn } from "hotscript"
import { AbstractClass, Class, Opaque } from "type-fest" import { AbstractClass, Class, Opaque } from "type-fest"
import { StaticMembers } from "./util" import { StaticMembers } from "./util"
@@ -56,6 +57,10 @@ export type TraitAbstractMembers<T> = (
: never : never
) )
export interface GetTraitAbstractMembers extends Fn {
return: TraitAbstractMembers<this["arg0"]>
}
export type TraitImplClass<T> = ( export type TraitImplClass<T> = (
T extends Trait<infer AbstractMembers, infer ImplWithAbstractMembers> T extends Trait<infer AbstractMembers, infer ImplWithAbstractMembers>
? RemoveAbstractMembersFromImpl< ? RemoveAbstractMembersFromImpl<
@@ -65,6 +70,10 @@ export type TraitImplClass<T> = (
: never : never
) )
export interface GetTraitImplClass extends Fn {
return: TraitImplClass<this["arg0"]>
}
export type TraitImplInstance<T> = ( export type TraitImplInstance<T> = (
T extends Trait<infer AbstractMembers, infer ImplWithAbstractMembers> T extends Trait<infer AbstractMembers, infer ImplWithAbstractMembers>
? RemoveAbstractMembersFromImplInstance< ? RemoveAbstractMembersFromImplInstance<
@@ -74,18 +83,30 @@ export type TraitImplInstance<T> = (
: never : never
) )
export interface GetTraitImplInstance extends Fn {
return: TraitImplInstance<this["arg0"]>
}
export type TraitClass<T> = ( export type TraitClass<T> = (
T extends Trait<any, infer ImplWithAbstractMembers> T extends Trait<any, infer ImplWithAbstractMembers>
? ImplWithAbstractMembers ? ImplWithAbstractMembers
: never : never
) )
export interface GetTraitClass extends Fn {
return: TraitClass<this["arg0"]>
}
export type TraitInstance<T> = ( export type TraitInstance<T> = (
T extends Trait<any, infer ImplWithAbstractMembers> T extends Trait<any, infer ImplWithAbstractMembers>
? InstanceType<ImplWithAbstractMembers> ? InstanceType<ImplWithAbstractMembers>
: never : never
) )
export interface GetTraitInstance extends Fn {
return: TraitInstance<this["arg0"]>
}
export type TraitApplierSuperTag = "@thilawyn/traitify-ts/TraitApplierSuper" export type TraitApplierSuperTag = "@thilawyn/traitify-ts/TraitApplierSuper"

0
src/util/extend.ts Normal file
View File