Project setup (#1)
All checks were successful
continuous-integration/drone/push Build is passing

Sets up project build and CI

Co-authored-by: Julien Valverdé <julien.valverde@mailo.com>
Reviewed-on: https://git.jvalver.de/Thilawyn/thilatrait/pulls/1
This commit was merged in pull request #1.
This commit is contained in:
Julien Valverdé
2023-12-09 02:22:38 +01:00
parent d7c80f0ba7
commit c6de7004d2
10 changed files with 360 additions and 0 deletions

87
src/trait.ts Normal file
View File

@@ -0,0 +1,87 @@
import { AbstractClass, Class, UnionToIntersection } from "type-fest"
import { copyClassProperties, flattenClass } from "./class"
import { StaticMembers } from "./utils"
export type Trait<T> =
AbstractClass<T, []>
// export function applyTrait<
// C extends Class<any, any> | AbstractClass<any, any>,
// TraitC extends Trait<any>,
// >(
// class_: C,
// trait: TraitC,
// ) {
// copyClassProperties(trait, class_)
// return class_ as (
// (C extends Class<any, any>
// ? Class<
// InstanceType<C> & InstanceType<TraitC>,
// ConstructorParameters<C>
// >
// : AbstractClass<
// InstanceType<C> & InstanceType<TraitC>,
// ConstructorParameters<C>
// >
// ) &
// StaticMembers<C> &
// StaticMembers<TraitC>
// )
// }
export const extendAndApplyTraits = <
C extends Class<any, any> | AbstractClass<any, any>,
Traits extends readonly Trait<any>[],
>(
classToExtend: C,
traits: Traits,
) =>
traits.reduce((class_, trait) => {
copyClassProperties(flattenClass(trait), class_)
return class_
}, class extends classToExtend {}) as (
AbstractClass<
InstanceType<C> &
UnionToIntersection<
InstanceType<Traits[number]>
>,
ConstructorParameters<C>
> &
StaticMembers<
C &
UnionToIntersection<
Traits[number]
>
>
)
export const mixTraits = <
Traits extends readonly Trait<any>[]
>(
...traits: Traits
) =>
traits.reduce((class_, trait) => {
copyClassProperties(flattenClass(trait), class_)
return class_
}, class {}) as (
Trait<
UnionToIntersection<
InstanceType<
Traits[number]
>
>
> &
StaticMembers<
UnionToIntersection<
Traits[number]
>
>
)