/** * * 在混入对象 * */ type ConflictStrategy = 'ignore' | 'replace' | 'merge' | 'error' | ((key: string, target: object, source: object) => 'ignore' | 'replace' | 'merge' | 'error' | undefined); interface MixinObjectOptions { excludes?: string[]; injectStatic?: boolean; conflict?: ConflictStrategy; } /** * * 本方法可以用来为类或实例混入属性/方法等 * 将source混入到target * * * @param {Object} target 目标对象 * @param {Object} source 将source混入到target * @param {Array } excludes 排除的字段名称列表 * @param {Boolean} injectStatic 是否注入静态变量,当source是一个类时,确认如何处理静态变量 * 如果target和source均是一个类,则source的静态属性也混入到target的构造中 * 如果target是一个实例,则source的静态属性应该混入到哪里比较合理? * - 如果混入到target.construct,则会影响到target类的所有实例,明显是比较不合理的,会对其他实例产生不可预知的影响,因此默认将不会混入 * - 但是如果target是一个单例,则混入不会产生重大影响 * 因此通过一个参数injectStatic来配置当target是一个实例时是否将静态属性混入到其构造中,一般仅仅在target是一个单例时使用 * 当injectStatic=true时,会将source的静态属性和方法均混入到target.construct * * @param {*} conflict 冲突处理策略 * 0:忽略,即不进行混入 * 1:替换,用source中的字段替换target中的 * 2:合并,按一定策略进行合并 * - 如果两者均是{},则进行深度合并 * - 如果两者均是[],则进行合并去重 * - 如果两者均是类属性,则采用替换方式 * - 如果两者均是函数,则生成一个()=>Promise.all([source fn],[target fn])的函数,即会同时执行这两个函数并返回结果集 * 3: 出错,直接抛出错误导致混入过程中断 * Function:自定义混入策略, 调用(key,target,source)返回合并后的结果 * conflict(key,target,source){ * - 定义新的属性: Object.defineProperty(target, key,descript) * - 返回默认的冲空处理策略: return <0|1|2|3> * } * 4. * * */ declare function mixinObject(target: any, source: any, options?: MixinObjectOptions): void; export { type ConflictStrategy, type MixinObjectOptions, mixinObject };