From c715d17c1ec6c29fc02a466f904c97bbcb97c271 Mon Sep 17 00:00:00 2001 From: Joe Pea Date: Thu, 16 Nov 2023 16:40:48 -0800 Subject: [PATCH] feat: add more constructor helpers for dealing also with abstract constructors: Constructor already exists for non-abstract classes, the AbstractConstructor type is added for abstract classes, and the AnyConstructor type is added for representing both. --- dist/utils.d.ts | 6 +++- dist/utils.d.ts.map | 2 +- dist/utils.js | 6 ++++ dist/utils.js.map | 2 +- src/utils.ts | 68 +++++++++++++++++++++++++++++++++++++++++++-- 5 files changed, 79 insertions(+), 5 deletions(-) diff --git a/dist/utils.d.ts b/dist/utils.d.ts index c091007..c17cb2c 100644 --- a/dist/utils.d.ts +++ b/dist/utils.d.ts @@ -14,7 +14,11 @@ interface DescriptorWithOwner extends PropertyDescriptor { export declare function getInheritedDescriptor(obj: T, key: keyof T): DescriptorWithOwner | undefined; export declare function getInheritedPropertyNames(obj: T): (keyof T)[]; export type Constructor = (new (...a: A) => T) & Static; -export declare function Constructor(Ctor: Constructor): Constructor & Static; +export declare function Constructor(Ctor: AnyConstructor): Constructor & Static; +export type AbstractConstructor = (abstract new (...a: A) => T) & Static; +export declare function AbstractConstructor(Ctor: AnyConstructor): AbstractConstructor & Static; +export type AnyConstructor = Constructor | AbstractConstructor; +export declare function AnyConstructor(Ctor: AnyConstructor): AnyConstructor & Static; export declare function hasPrototype(obj: any, proto: any): boolean; export declare function copyDescriptors(source: Object, destination: Object, mod?: any): void; export declare function setDefaultPrototypeDescriptors(prototype: Object, { defaultClassDescriptor: { writable, enumerable, configurable } }: any): void; diff --git a/dist/utils.d.ts.map b/dist/utils.d.ts.map index e058798..e4f7650 100644 --- a/dist/utils.d.ts.map +++ b/dist/utils.d.ts.map @@ -1 +1 @@ -{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":"AAEA,qBAAa,aAAa;IACzB,CAAC,wBAAgB;IACjB,GAAG,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM;IAIxB,GAAG,CAAC,IAAI,EAAE,MAAM;IAGhB,GAAG,CAAC,IAAI,EAAE,MAAM;CAGhB;AAGD,wBAAgB,eAAe,CAAC,EAAE,EAAE,QAAQ,GAAG,MAAM,CAKpD;AAQD,wBAAgB,aAAa,CAAC,CAAC,SAAS,EAAE,EACzC,GAAG,EAAE,CAAC,EACN,GAAG,EAAE,MAAM,CAAC,EACZ,aAAa,EAAE,kBAAkB,EACjC,SAAS,UAAQ,GACf,IAAI,CAKN;AAED,wBAAgB,cAAc,CAAC,GAAG,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,CAAC,MAAM,EAAE,kBAAkB,CAAC,GAAG,IAAI,CAYpG;AA2BD,wBAAgB,kBAAkB,CAAC,CAAC,SAAS,MAAM,GAAG,kBAAkB,EACvE,GAAG,EAAE,CAAC,EACN,GAAG,CAAC,EAAE,MAAM,CAAC,EACb,SAAS,UAAO,GACd,OAAO,CAaT;AAED,UAAU,mBAAoB,SAAQ,kBAAkB;IACvD,KAAK,EAAE,MAAM,CAAA;CACb;AAED,wBAAgB,sBAAsB,CAAC,CAAC,SAAS,MAAM,EAAE,GAAG,EAAE,CAAC,EAAE,GAAG,EAAE,MAAM,CAAC,GAAG,mBAAmB,GAAG,SAAS,CAgB9G;AAED,wBAAgB,yBAAyB,CAAC,CAAC,SAAS,MAAM,EAAE,GAAG,EAAE,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,EAAE,CAa/E;AAED,MAAM,MAAM,WAAW,CAAC,CAAC,GAAG,MAAM,EAAE,CAAC,SAAS,GAAG,EAAE,GAAG,GAAG,EAAE,EAAE,MAAM,GAAG,EAAE,IAAI,CAAC,KAAK,GAAG,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,GAAG,MAAM,CAAA;AAGzG,wBAAgB,WAAW,CAAC,CAAC,GAAG,MAAM,EAAE,MAAM,GAAG,EAAE,EAAE,IAAI,EAAE,WAAW,CAAC,GAAG,CAAC,GAAG,WAAW,CAAC,CAAC,CAAC,GAAG,MAAM,CAEpG;AAGD,wBAAgB,YAAY,CAAC,GAAG,EAAE,GAAG,EAAE,KAAK,EAAE,GAAG,WAShD;AAGD,wBAAgB,eAAe,CAAC,MAAM,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,GAAG,CAAC,EAAE,GAAG,QAS7E;AAED,wBAAgB,8BAA8B,CAC7C,SAAS,EAAE,MAAM,EACjB,EAAC,sBAAsB,EAAE,EAAC,QAAQ,EAAE,UAAU,EAAE,YAAY,EAAC,EAAC,EAAE,GAAG,QAmBnE;AAED,wBAAgB,2BAA2B,CAC1C,IAAI,EAAE,GAAG,EACT,EAAC,sBAAsB,EAAE,EAAC,QAAQ,EAAE,UAAU,EAAE,YAAY,EAAC,EAAC,EAAE,GAAG,EACnE,eAAe,CAAC,EAAE,CAAC,MAAM,GAAG,MAAM,CAAC,EAAE,QAwBrC"} \ No newline at end of file +{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":"AAEA,qBAAa,aAAa;IACzB,CAAC,wBAAgB;IACjB,GAAG,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM;IAIxB,GAAG,CAAC,IAAI,EAAE,MAAM;IAGhB,GAAG,CAAC,IAAI,EAAE,MAAM;CAGhB;AAGD,wBAAgB,eAAe,CAAC,EAAE,EAAE,QAAQ,GAAG,MAAM,CAKpD;AAQD,wBAAgB,aAAa,CAAC,CAAC,SAAS,EAAE,EACzC,GAAG,EAAE,CAAC,EACN,GAAG,EAAE,MAAM,CAAC,EACZ,aAAa,EAAE,kBAAkB,EACjC,SAAS,UAAQ,GACf,IAAI,CAKN;AAED,wBAAgB,cAAc,CAAC,GAAG,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,CAAC,MAAM,EAAE,kBAAkB,CAAC,GAAG,IAAI,CAYpG;AA2BD,wBAAgB,kBAAkB,CAAC,CAAC,SAAS,MAAM,GAAG,kBAAkB,EACvE,GAAG,EAAE,CAAC,EACN,GAAG,CAAC,EAAE,MAAM,CAAC,EACb,SAAS,UAAO,GACd,OAAO,CAaT;AAED,UAAU,mBAAoB,SAAQ,kBAAkB;IACvD,KAAK,EAAE,MAAM,CAAA;CACb;AAED,wBAAgB,sBAAsB,CAAC,CAAC,SAAS,MAAM,EAAE,GAAG,EAAE,CAAC,EAAE,GAAG,EAAE,MAAM,CAAC,GAAG,mBAAmB,GAAG,SAAS,CAgB9G;AAED,wBAAgB,yBAAyB,CAAC,CAAC,SAAS,MAAM,EAAE,GAAG,EAAE,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,EAAE,CAa/E;AAWD,MAAM,MAAM,WAAW,CAAC,CAAC,GAAG,MAAM,EAAE,CAAC,SAAS,GAAG,EAAE,GAAG,GAAG,EAAE,EAAE,MAAM,GAAG,EAAE,IAAI,CAAC,KAAK,GAAG,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,GAAG,MAAM,CAAA;AAQzG,wBAAgB,WAAW,CAAC,CAAC,GAAG,MAAM,EAAE,MAAM,GAAG,EAAE,EAAE,IAAI,EAAE,cAAc,CAAC,GAAG,CAAC,GAAG,WAAW,CAAC,CAAC,CAAC,GAAG,MAAM,CAEvG;AAWD,MAAM,MAAM,mBAAmB,CAAC,CAAC,GAAG,MAAM,EAAE,CAAC,SAAS,GAAG,EAAE,GAAG,GAAG,EAAE,EAAE,MAAM,GAAG,EAAE,IAAI,CAAC,QAAQ,MAAM,GAAG,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,GAChH,MAAM,CAAA;AAQP,wBAAgB,mBAAmB,CAAC,CAAC,GAAG,MAAM,EAAE,MAAM,GAAG,EAAE,EAC1D,IAAI,EAAE,cAAc,CAAC,GAAG,CAAC,GACvB,mBAAmB,CAAC,CAAC,CAAC,GAAG,MAAM,CAEjC;AAcD,MAAM,MAAM,cAAc,CAAC,CAAC,GAAG,MAAM,EAAE,CAAC,SAAS,GAAG,EAAE,GAAG,GAAG,EAAE,EAAE,MAAM,GAAG,EAAE,IACxE,WAAW,CAAC,CAAC,EAAE,CAAC,EAAE,MAAM,CAAC,GACzB,mBAAmB,CAAC,CAAC,EAAE,CAAC,EAAE,MAAM,CAAC,CAAA;AAQpC,wBAAgB,cAAc,CAAC,CAAC,GAAG,MAAM,EAAE,MAAM,GAAG,EAAE,EAAE,IAAI,EAAE,cAAc,CAAC,GAAG,CAAC,GAAG,cAAc,CAAC,CAAC,CAAC,GAAG,MAAM,CAE7G;AAGD,wBAAgB,YAAY,CAAC,GAAG,EAAE,GAAG,EAAE,KAAK,EAAE,GAAG,WAShD;AAGD,wBAAgB,eAAe,CAAC,MAAM,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,GAAG,CAAC,EAAE,GAAG,QAS7E;AAED,wBAAgB,8BAA8B,CAC7C,SAAS,EAAE,MAAM,EACjB,EAAC,sBAAsB,EAAE,EAAC,QAAQ,EAAE,UAAU,EAAE,YAAY,EAAC,EAAC,EAAE,GAAG,QAmBnE;AAED,wBAAgB,2BAA2B,CAC1C,IAAI,EAAE,GAAG,EACT,EAAC,sBAAsB,EAAE,EAAC,QAAQ,EAAE,UAAU,EAAE,YAAY,EAAC,EAAC,EAAE,GAAG,EACnE,eAAe,CAAC,EAAE,CAAC,MAAM,GAAG,MAAM,CAAC,EAAE,QAwBrC"} \ No newline at end of file diff --git a/dist/utils.js b/dist/utils.js index f392ae3..3f362ee 100644 --- a/dist/utils.js +++ b/dist/utils.js @@ -94,6 +94,12 @@ export function getInheritedPropertyNames(obj) { export function Constructor(Ctor) { return Ctor; } +export function AbstractConstructor(Ctor) { + return Ctor; +} +export function AnyConstructor(Ctor) { + return Ctor; +} export function hasPrototype(obj, proto) { let currentProto = obj.__proto__; do { diff --git a/dist/utils.js.map b/dist/utils.js.map index d8cd781..192ec0f 100644 --- a/dist/utils.js.map +++ b/dist/utils.js.map @@ -1 +1 @@ -{"version":3,"file":"utils.js","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"utils.js","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/src/utils.ts b/src/utils.ts index 02a835b..40eb33f 100644 --- a/src/utils.ts +++ b/src/utils.ts @@ -135,13 +135,77 @@ export function getInheritedPropertyNames(obj: T): (keyof T)[] return keys } +/** + * Without type args, this is an easy shortcut for "any non-abstract constructor + * that has any args and returns any type of object". + * + * With type args, define a non-abstract constructor type that returns a certain + * instance type (optional), accepts certain args (optional, defaults to any + * args for simplicity in cases like class-factory mixins), and has certain + * static members (optional). + */ export type Constructor = (new (...a: A) => T) & Static -// this is used for type casting in special cases, see the declaration file -export function Constructor(Ctor: Constructor): Constructor & Static { +/** + * Cast any constructor type (abstract or not) into a specific Constructor type. + * Useful for forcing type checks inside of mixins for example. This is unsafe: + * you can incorrectly cast one constructor into an unrelated constructor type, + * so use with care. + */ +export function Constructor(Ctor: AnyConstructor): Constructor & Static { return Ctor as unknown as Constructor & Static } +/** + * Without type args, this is an easy shortcut for "any abstract constructor + * that has any args and returns any type of object". + * + * With type args, define an abstract constructor type that returns a certain + * instance type (optional), accepts certain args (optional, defaults to any + * args for simplicity in cases like class-factory mixins), and has certain + * static members (optional). + */ +export type AbstractConstructor = (abstract new (...a: A) => T) & + Static + +/** + * Cast any constructor type (abstract or not) into a specific + * AbstractConstructor type. Useful for forcing type checks inside of mixins + * for example. This is unsafe: you can incorrectly cast one constructor into an + * unrelated constructor type, so use with care. + */ +export function AbstractConstructor( + Ctor: AnyConstructor, +): AbstractConstructor & Static { + return Ctor as unknown as AbstractConstructor & Static +} + +/** + * Combines Constructor and AbstractConstructor to support assigning any type of + * constructor whether abstract or not. + * + * Without type args, this is an easy shortcut for "any constructor, abstract or not, + * that has any args and returns any type of object". + * + * With type args, define a constructor type (abstract or not) that returns a + * certain instance type (optional), accepts certain args (optional, defaults to + * any args for simplicity in cases like class-factory mixins), and has certain + * static members (optional). + */ +export type AnyConstructor = + | Constructor + | AbstractConstructor + +/** + * Cast any constructor type (abstract or not) into a specific + * AnyConstructor type. Useful for forcing type checks inside of mixins + * for example. This is unsafe: you can incorrectly cast one constructor into an + * unrelated constructor type, so use with care. + */ +export function AnyConstructor(Ctor: AnyConstructor): AnyConstructor & Static { + return Ctor as unknown as AnyConstructor & Static +} + // check if an object has the given prototype in its chain export function hasPrototype(obj: any, proto: any) { let currentProto = obj.__proto__