This commit is contained in:
@@ -1,5 +1,5 @@
|
|||||||
import { uniq } from "lodash-es"
|
import { uniq } from "lodash-es"
|
||||||
import { AbstractClass } from "type-fest"
|
import { AbstractClass, IsEqual } from "type-fest"
|
||||||
import { Trait, TraitTuple } from "./Trait"
|
import { Trait, TraitTuple } from "./Trait"
|
||||||
import { TraitExpression } from "./TraitExpression"
|
import { TraitExpression } from "./TraitExpression"
|
||||||
import { Extendable, StaticMembers } from "./util"
|
import { Extendable, StaticMembers } from "./util"
|
||||||
@@ -15,6 +15,21 @@ type SpreadSupertraits<T> = (
|
|||||||
: []
|
: []
|
||||||
)
|
)
|
||||||
|
|
||||||
|
type TraitsUniq<Traits> = (
|
||||||
|
Traits extends [...infer Rest, infer Trait]
|
||||||
|
? IsTraitInTupleFromRight<Rest, Trait> extends true
|
||||||
|
? TraitsUniq<Rest>
|
||||||
|
: [...TraitsUniq<Rest>, Trait]
|
||||||
|
: []
|
||||||
|
)
|
||||||
|
type IsTraitInTupleFromRight<Traits, T> = (
|
||||||
|
Traits extends [...infer Rest, infer Trait]
|
||||||
|
? IsEqual<Trait, T> extends true
|
||||||
|
? true
|
||||||
|
: IsTraitInTupleFromRight<Rest, T>
|
||||||
|
: false
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
type BuildTraitExpression<
|
type BuildTraitExpression<
|
||||||
Superclass extends AbstractClass<object>,
|
Superclass extends AbstractClass<object>,
|
||||||
@@ -80,7 +95,7 @@ export class TraitExpressionBuilder<
|
|||||||
...trait.superExpression.traits,
|
...trait.superExpression.traits,
|
||||||
trait,
|
trait,
|
||||||
]),
|
]),
|
||||||
]) as [...Traits, ...SpreadSupertraits<T>],
|
]) as TraitsUniq<[...Traits, ...SpreadSupertraits<T>]>,
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -81,9 +81,3 @@ class User extends exp.extends implements Implements<typeof exp> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
console.log(new User())
|
console.log(new User())
|
||||||
|
|
||||||
|
|
||||||
// type T = NonExtendableKeys<[
|
|
||||||
// { prout: "gneugneu" },
|
|
||||||
// { prout: string },
|
|
||||||
// ]>
|
|
||||||
|
|||||||
Reference in New Issue
Block a user