diff --git a/src/tests.ts b/src/tests.ts index 09fa326..51641af 100644 --- a/src/tests.ts +++ b/src/tests.ts @@ -2,7 +2,7 @@ import { TraitClass } from "./Trait" import { trait } from "./TraitBuilder" import { Implements, ImplementsStatic, TraitExpressionClass } from "./TraitExpression" import { expression } from "./TraitExpressionBuilder" -import { Extendable } from "./util" +import { Extendable, NonExtendableKeys } from "./util" const PrintsHelloOnNew = trait @@ -84,7 +84,7 @@ class User extends exp.extends implements Implements { console.log(new User()) -type T = Extendable<[ +type T = NonExtendableKeys<[ { prout: string }, { prout: "gneugneu" }, ]> diff --git a/src/util/extend.ts b/src/util/extend.ts index e4a1460..6f1c498 100644 --- a/src/util/extend.ts +++ b/src/util/extend.ts @@ -24,7 +24,7 @@ export type Extend = ( T extends [ infer Super, infer Self, - ...infer Rest extends object[] + ...infer Rest extends object[], ] ? Pick> extends Pick> ? Extend<[ @@ -39,13 +39,13 @@ export type Extend = ( export type Extendable = ( T extends [ - infer Super extends object, - infer Self extends object, + infer Super, + infer Self, ...infer Rest extends object[], ] ? Pick> extends Pick> ? Extendable<[ - Super & Self, + Omit> & Self, ...Rest, ]> : false @@ -53,7 +53,19 @@ export type Extendable = ( ) export type NonExtendableKeys = ( - Extendable extends false - ? {} - : never + T extends [ + infer Super extends object, + infer Self extends object, + ...infer Rest extends object[], + ] + ? { + [K in keyof Super & keyof Self]: Self[K] extends Super[K] + ? never + : K + }[keyof Super & keyof Self] + | NonExtendableKeys<[ + Super & Self, + ...Rest, + ]> + : void )