import '../types.js'; import { Class } from '../types/class.js'; import { Fallback } from '../types/fallback.js'; import '../types/mutableRecordList.js'; import '../types/mutableRecord.js'; import '../types/union.js'; import '../types/changeFieldType.js'; import '../types/valueOf.js'; import '../types/optional.js'; import '../types/dict.js'; import '../types/JsonObject.js'; import '../types/deepPartial.js'; import '../types/deepRequired.js'; import '../types/ObjectKeys.js'; import '../types/requiredKeys.js'; import '../types/getTypeByPath.js'; import 'type-fest'; import '../types/objectKeyPaths.js'; import '../types/keys.js'; import '../types/arrayMember.js'; import '../types/Unique.js'; import '../types/syncFunction.js'; import '../types/argument.js'; import '../types/lastArgument.js'; import '../types/asyncFunction.js'; import '../types/overloads.js'; import '../types/changeReturns.js'; import '../types/implementOf.js'; import '../types/firstUpper.js'; import '../types/firstLower.js'; import '../types/primitive.js'; import '../types/IsNumberLike.js'; import '../types/merge.js'; import '../types/collection.js'; import '../types/timeDuration.js'; import '../types/fileSize.js'; import '../types/rename.js'; import '../types/allowEmpty.js'; type StrictTuple = T extends readonly [...infer E] ? E : [...never]; /** * 表示一个魔术类构造函数,既可以作为构造函数使用,也可以作为函数调用来配置选项 * @template Base 基础类类型 * @template Options 配置选项类型 */ /** * 表示一个魔术类构造函数,既可以作为构造函数使用,也可以作为函数调用来配置选项 * @template Base 基础类类型 * @template Options 配置选项类型 */ interface MagicClassConstructor> { /** 作为构造函数使用,创建基础类的实例 */ new (...args: StrictTuple): InstanceType; /** 作为函数调用,配置选项并返回配置后的构造函数 */ (...args: StrictTuple): MagicClassConstructor>; (createOptions: CreateMagicClassOptions): MagicClassConstructor>; /** 原型属性,继承自基础类 */ prototype: InstanceType; } /** * 创建魔术类的配置选项 * @template Base 基础类类型 * @template Options 扩展配置选项类型 */ type CreateMagicClassOptions, Params = ConstructorParameters> = { params?: Params | ((params: RefParams, scopeParms: Params) => Params); /** 实例创建前的钩子函数,可以阻止实例创建或修改类 */ onBeforeInstance?: (cls: Base, params: Params) => void | boolean | object; /** 实例创建后的钩子函数 */ onAfterInstance?: (inst: InstanceType) => void; /** 实例创建出错时的钩子函数 */ onErrorInstance?: (error: Error, cls: Base, params: Params) => void; }; type MagicClassScope = CreateMagicClassOptions & { __MAGIC_CLASS_SCOPE: boolean; finalParams: any[]; }; /** * 创建一个魔术类,该类既可以作为构造函数使用,也可以作为函数调用来配置选项 * * 魔术类具有以下特性: * 1. 可以作为构造函数使用:`new MagicClass(...args)` * 2. 可以作为函数调用来配置选项:`MagicClass(options)`,返回配置后的构造函数 * 3. 支持生命周期钩子:onBeforeInstance、onAfterInstance、onErrorInstance * * @template BaseClass 基础类类型 * @template Options 配置选项类型 * @param classBase 要包装的基础类 * @param options 创建魔术类的配置选项 * @returns 魔术类构造函数 * * @example * // 基本用法 * class MyClass { * constructor(name: string) { * this.name = name; * } * } * * const MagicMyClass = createMagicClass(MyClass); * const instance = new MagicMyClass("test"); * * @example * // 使用配置选项 * const MagicMyClass = createMagicClass(MyClass, { * onBeforeInstance: (cls, args, options) => { * console.log("Before instance creation", args); * }, * onAfterInstance: (instance, options) => { * console.log("Instance created", instance); * } * }); * * // 函数调用配置 * const ConfiguredClass = MagicMyClass({ extraOption: true }); * const instance = new ConfiguredClass("test"); */ declare function createMagicClass(classBase: BaseClass, options?: CreateMagicClassOptions): MagicClassConstructor; export { type CreateMagicClassOptions, type MagicClassConstructor, type MagicClassScope, createMagicClass };