diff --git a/src/TraitExpressionBuilder.ts b/src/TraitExpressionBuilder.ts index 89b01ec..7921146 100644 --- a/src/TraitExpressionBuilder.ts +++ b/src/TraitExpressionBuilder.ts @@ -1,5 +1,5 @@ import { uniq } from "lodash-es" -import { AbstractClass } from "type-fest" +import { AbstractClass, IsEqual } from "type-fest" import { Trait, TraitTuple } from "./Trait" import { TraitExpression } from "./TraitExpression" import { Extendable, StaticMembers } from "./util" @@ -15,6 +15,21 @@ type SpreadSupertraits = ( : [] ) +type TraitsUniq = ( + Traits extends [...infer Rest, infer Trait] + ? IsTraitInTupleFromRight extends true + ? TraitsUniq + : [...TraitsUniq, Trait] + : [] +) +type IsTraitInTupleFromRight = ( + Traits extends [...infer Rest, infer Trait] + ? IsEqual extends true + ? true + : IsTraitInTupleFromRight + : false +) + type BuildTraitExpression< Superclass extends AbstractClass, @@ -80,7 +95,7 @@ export class TraitExpressionBuilder< ...trait.superExpression.traits, trait, ]), - ]) as [...Traits, ...SpreadSupertraits], + ]) as TraitsUniq<[...Traits, ...SpreadSupertraits]>, ) } diff --git a/src/tests.ts b/src/tests.ts index daf516b..631b011 100644 --- a/src/tests.ts +++ b/src/tests.ts @@ -81,9 +81,3 @@ class User extends exp.extends implements Implements { } console.log(new User()) - - -// type T = NonExtendableKeys<[ -// { prout: "gneugneu" }, -// { prout: string }, -// ]>