Compare commits

..

2 Commits

Author SHA1 Message Date
Julien Valverdé
af45a26c73 abstractType
All checks were successful
continuous-integration/drone/push Build is passing
2024-05-12 21:04:02 +02:00
Julien Valverdé
c12a80e007 abstractType 2024-05-12 21:03:56 +02:00
7 changed files with 40 additions and 23 deletions

BIN
bun.lockb

Binary file not shown.

View File

@@ -1,6 +1,6 @@
{ {
"name": "@thilawyn/traitify-ts", "name": "@thilawyn/traitify-ts",
"version": "0.1.24", "version": "0.1.23",
"type": "module", "type": "module",
"publishConfig": { "publishConfig": {
"registry": "https://git.jvalver.de/api/packages/thilawyn/npm/" "registry": "https://git.jvalver.de/api/packages/thilawyn/npm/"
@@ -30,12 +30,12 @@
"default": "./dist/effect/lib.cjs" "default": "./dist/effect/lib.cjs"
} }
}, },
"./traitsUnique-DCJN7XEW": { "./traitsUnique-h-N6REho": {
"import": { "import": {
"types": "./dist/traitsUnique-DCJN7XEW.d.ts" "types": "./dist/traitsUnique-h-N6REho.d.ts"
}, },
"require": { "require": {
"types": "./dist/traitsUnique-DCJN7XEW.d.ts" "types": "./dist/traitsUnique-h-N6REho.d.ts"
} }
} }
}, },
@@ -55,7 +55,7 @@
"npm-check-updates": "^16.14.20", "npm-check-updates": "^16.14.20",
"npm-sort": "^0.0.4", "npm-sort": "^0.0.4",
"tsup": "^8.0.2", "tsup": "^8.0.2",
"tsx": "^4.10.1", "tsx": "^4.10.0",
"typescript": "^5.4.5" "typescript": "^5.4.5"
}, },
"optionalDependencies": { "optionalDependencies": {

View File

@@ -24,13 +24,13 @@ export class TraitBuilder<
) {} ) {}
abstract<A extends AbstractConstructor<Abstract> & StaticAbstract>( abstract<A extends Abstract>(
_: (Super: AbstractConstructor<Abstract> & StaticAbstract) => A _: (Super: AbstractConstructor<Abstract>) => AbstractConstructor<A, []>
) { ) {
return new TraitBuilder( return new TraitBuilder(
this.traitSuperExpression, this.traitSuperExpression,
{} as Simplify<InstanceType<A>>, {} as Simplify<A>,
{} as Simplify<StaticMembers<A>>, this.traitStaticAbstract,
this.traitApply, this.traitApply,
) )
} }
@@ -46,6 +46,17 @@ export class TraitBuilder<
) )
} }
staticAbstract<A extends StaticAbstract>(
_: (Super: AbstractConstructor<StaticAbstract>) => AbstractConstructor<A, []>
) {
return new TraitBuilder(
this.traitSuperExpression,
this.traitAbstract,
{} as Simplify<A>,
this.traitApply,
)
}
staticAbstractType<A extends StaticAbstract>( staticAbstractType<A extends StaticAbstract>(
_: (Super: StaticAbstract) => typeof type<A> _: (Super: StaticAbstract) => typeof type<A>
) { ) {
@@ -174,7 +185,7 @@ export function implStaticInstantiableThis<
export const trait = new TraitBuilder( export const trait = new TraitBuilder(
new TraitExpression(TraitExpression.NullSuperclass, []), new TraitExpression(TraitExpression.NullSuperclass, []),
{} as {}, {} as object,
{} as {}, {} as object,
Super => class extends Super {} as AbstractConstructor<{}>, Super => class extends Super {} as AbstractConstructor<object>,
) )

View File

@@ -142,7 +142,7 @@ export type TraitExpressionClass<
TraitExpressionStaticMembers<Exp> TraitExpressionStaticMembers<Exp>
) )
export type TraitExpressionInstantiableClass< export type TraitExpressionConcreteClass<
Exp extends TraitExpressionLike<any, readonly Trait<any, any, any, any>[]> Exp extends TraitExpressionLike<any, readonly Trait<any, any, any, any>[]>
> = ( > = (
Constructor< Constructor<

View File

@@ -32,14 +32,17 @@ implements TraitExpressionLike<
extends<Self>(): ( extends<Self>(): (
AbstractConstructor< AbstractConstructor<
Simplify<
ApplyMutability<S.Struct.Type<Fields>, Mutability> & ApplyMutability<S.Struct.Type<Fields>, Mutability> &
Omit<
Simplify<
Extend<[ Extend<[
Omit<Inherited, keyof Fields>, Inherited,
...TraitTuple.MapImplInstance<Traits> ...TraitTuple.MapImplInstance<Traits>
]> & ]>
Proto
>, >,
keyof Fields
> &
Proto,
ConstructorParameters<S.Class<unknown, Fields, I, R, C, Inherited, Proto>> ConstructorParameters<S.Class<unknown, Fields, I, R, C, Inherited, Proto>>
> & > &
@@ -54,6 +57,7 @@ implements TraitExpressionLike<
Proto Proto
> >
> & > &
Simplify< Simplify<
Extend<[ Extend<[
Static, Static,

View File

@@ -1,5 +1,5 @@
export { Trait, TraitClass, TraitConcreteClass, TraitInstance, TraitStaticMembers, TraitTuple } from "./Trait" export { Trait, TraitClass, TraitConcreteClass, TraitInstance, TraitStaticMembers, TraitTuple } from "./Trait"
export { ImplStatic, TraitBuilder, implStaticInstantiableThis, implStaticThis, trait } from "./TraitBuilder" export { ImplStatic, TraitBuilder, implStaticInstantiableThis, implStaticThis, trait } from "./TraitBuilder"
export { Implements, StaticImplements, TraitExpression, TraitExpressionClass, TraitExpressionInstance, TraitExpressionInstantiableClass, TraitExpressionStaticMembers } from "./TraitExpression" export { Implements, StaticImplements, TraitExpression, TraitExpressionClass, TraitExpressionConcreteClass, TraitExpressionInstance, TraitExpressionStaticMembers } from "./TraitExpression"
export { TraitExpressionBuilder, expression } from "./TraitExpressionBuilder" export { TraitExpressionBuilder, expression } from "./TraitExpressionBuilder"
export { type } from "./util" export { type } from "./util"

View File

@@ -12,6 +12,8 @@ export type CommonKeys<A, B> = Extract<keyof A, keyof B>
* Represents the static members of a class. * Represents the static members of a class.
* @template Class - A class. * @template Class - A class.
*/ */
export type StaticMembers<Class extends AbstractConstructor<any>> = Omit<Class, "prototype"> export type StaticMembers<Class extends AbstractConstructor<any>> = (
Omit<Class, "prototype">
)
export function type<T>() { return {} as T } export function type<T>() { return {} as T }