From eee35e7d595b4117ecf7f7775bfa90fb1962250a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Valverd=C3=A9?= Date: Mon, 19 Feb 2024 21:19:25 +0100 Subject: [PATCH] NonExtendableKeys --- src/tests.ts | 4 ++-- src/util/extend.ts | 26 +++++++++++++++++++------- 2 files changed, 21 insertions(+), 9 deletions(-) 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 )