/**
 * magix3 namespace
 */
declare namespace Magix3 {
    /**
     * 配置信息接口
     */
    interface Config {
        /**
         * 默认加载的view
         */
        defaultView?: string
        /**
         * 默认路径
         */
        defaultPath?: string
        /**
         * path与view关系映射对象或方法
         */
        routes?: string | ((this: Config, path: string, loc?: RouterParse) => string)
        /**
         * 在routes里找不到匹配时使用的view，比如显示404
         */
        unmatchView?: string
        /**
         * 根view的id
         */
        rootId?: string
        /**
         * 项目启动时加载的扩展，这些扩展会在项目初始化之前加载进来
         */
        exts?: string[]
        /**
         * 以try catch执行一些用户重写的核心流程，当出错时，允许开发者通过该配置项进行捕获。注意：您不应该在该方法内再次抛出任何错误
         */
        error?: (this: void, exception: Error) => void
        /**
         * 其它配置项
         */
        [key: string]: any
    }
    /**
     * url解析部分对象接口
     */
    interface RouterParseParts {
        /**
         * 参数对象
         */
        readonly params: {
            readonly [key: string]: string
        }
        /**
         * 路径字符串
         */
        readonly path: string
    }
    /**
     * url解析接口
     */
    interface RouterParse {
        /**
         * 原始的href
         */
        readonly href: string

        /**
         * 原始的query
         */
        readonly srcQuery: string

        /**
         * 原始的hash
         */
        readonly srcHash: string

        /**
         * srcQuery解析出的对象
         */
        readonly query: RouterParseParts

        /**
         * srcHash解析出的对象
         */
        readonly hash: RouterParseParts
        /**
         * query中的params与hash中的params对象合并出来的新对象
         */
        readonly params: {
            readonly [key: string]: string
        }

        /**
         * 根据hash对象中的path和query对象中的path，再根据要求得出的path
         */
        readonly path: string

        /**
         * 当前url对应的要渲染的根view
         */
        readonly view: string
        /**
         * 从params中获取参数值，当参数不存在时返回空字符串
         * @param key key
         * @param defaultValue 当值不存在时候返回的默认值
         */
        get<TDefaultValueType = any>(key: string, defaultValue?: TDefaultValueType): string

    }
    /**
     * 差异对象接口
     */
    interface RouterDiffItem {
        /**
         * 旧值
         */
        readonly from: string

        /**
         * 新值
         */
        readonly to: string
    }
    /**
     * url差异对象接口
     */
    interface RouterDiff {
        /**
         * 是否为应用首次初始化时强制触发的差异比较
         */
        readonly force: boolean
        /**
         * 当路径有变化时，才有path这个对象
         */
        readonly path?: RouterDiffItem

        /**
         * 当渲染的根view有变化时，才有view这个对象
         */
        readonly view?: RouterDiffItem

        /**
         * 都有哪些参数发生变化的对象
         */
        readonly params: {
            readonly [key: string]: RouterDiffItem
        }
    }
    /**
     * view更新器接口
     */
    interface Updater {

        /**
         * 获取设置的数据，当key未传递时，返回整个数据对象
         * @param key 设置时的数据key
         */
        get<TReturnType = any>(key?: string): TReturnType
        /**
         * 设置数据
         * @param data 数据对象，如{a:20,b:30}
         * @param unchanged 指示哪些数据并没有变化的对象
         */
        set(data?: { [key: string]: any }, unchanged?: { [key: string]: any }, ): this

        /**
         * 通过path获取值，path形如"data.list.2.name"字符串
         * @param path 路径
         */
        //gain<TReturnType>(path: string): TReturnType

        /**
         * 检测数据变化，更新界面，放入数据后需要显式调用该方法才可以把数据更新到界面
         * @param data 数据对象，如{a:20,b:30}
         * @param unchanged 指示哪些数据并没有变化的对象
         * @param resolve 完成更新后的回调
         */
        digest(data?: { [key: string]: any }, unchanged?: { [key: string]: any }, resolve?: Function): void

        /**
         * 获取当前数据状态的快照，配合altered方法可获得数据是否有变化
         */
        snapshot(): this

        /**
         * 检测数据是否有变动
         */
        altered(): boolean
        /**
         * 得到模板中@符号对应的原始数据
         * @param data 数据对象
         */
        translate(data: object): object
        /**
         * 得到模板中@符号对应的原始数据
         * @param origin 源字符串
         */
        parse(origin: string): object
    }
    /**
     * 数据载体接口
     */
    interface Bag {
        /**
         * bag id
         */
        id: string

        /**
         * 从bag中获取数据
         * @param key 数据key，如果未传递则返回整个数据对象
         * @param defaultValue 默认值，如果传递了该参数且从bag中获取到的数据类型如果与defaultValue不一致，则使用defaultValue
         */
        get<TReturnAndDefaultValueType = any>(key?: string, defaultValue?: TReturnAndDefaultValueType): TReturnAndDefaultValueType

        /**
         * 设置数据
         * @param key 数据key
         * @param value 数据
         */
        set(key: string, value: any): void

        /**
         * 设置数据
         * @param data 包含数据的对象
         */
        set(data: object): void
    }
    /**
     * Magix.State变化事件接口
     */
    interface StateChangedEvent extends TriggerEventDescriptor {
        /**
         * 包含哪些数据变化的集合对象
         */
        readonly keys: {
            readonly [key: string]: 1
        }
    }
    /**
     * 事件对象接口
     */
    interface Event<T = any> {
        /**
         * 绑定事件
         * @param name 事件名称
         * @param fn 事件处理函数
         */
        on(name: string, fn: (this: T, e?: TriggerEventDescriptor) => void): this

        /**
         * 解除事件绑定
         * @param name 事件名称
         * @param fn 事件处理函数
         */
        off(name: string, fn?: Function): this

        /**
         * 派发事件
         * @param name 事件名称
         * @param data 事件参数
         * @param remove 是否移除所有的事件监听
         * @param lastToFirst 是否倒序派发列表中的监听
         */
        fire(name: string, data?: object, remove?: boolean, lastToFirst?: boolean): this
    }
    /**
     * 状态接口
     */
    interface State extends Event<State> {
        /**
         * 从状态对象中获取数据
         * @param key 数据key，如果未传递则返回整个状态对象
         */
        get<TReturnType = any>(key?: string): TReturnType
        /**
         * 设置数据
         * @param data 数据对象
         * @param unchanged 指示哪些数据并没有变化的对象
         */
        set(data: object, unchanged?: { [key: string]: any }): this
        /**
         * 清理Magix.State中的数据，只能在view的mixins中使用，如 mixins:[Magix.State.clean("a,b")]
         * @param keys 逗号分割的字符串
         */
        clean(keys: string): void
        /**
         * 检测数据变化，派发changed事件，通过set放入数据后需要显式调用该方法才会派发事件
         * @param data 数据对象，如{a:20,b:30}
         * @param unchanged 指示哪些数据并没有变化的对象
         */
        digest(data?: object, unchanged?: { [key: string]: any }): void
        /**
         * 返回有哪些变化的数据key
         */
        diff(): object
        /**
         * 建立数据与key的引用关系
         * @param keys 逗号分割的字符串
         */
        setup(keys: string): void
        /**
         * 解除数据与key的引用关系
         * @param keys 逗号分割的字符串
         */
        teardown(keys: string): void
        /**
         * State中的数据发生变化时触发
         */
        onchanged: (this: this, e?: StateChangedEvent) => void
    }
    /**
     * api注册信息接口
     */
    interface ServiceInterfaceMeta {
        /**
         * 缓存时间，以毫秒为单位
         */
        cache?: number
        /**
         * 请求的url地址
         */
        url?: string
        /**
         * 添加的接口元信息名称，需要确保在一个Service中唯一
         */
        name: string
        /**
         * 逗号分割的字符串，用来清除其它接口的缓存，如该接口是一个添加新数据的接口，这个接口调用成功后，应该把所有获取相关数据的缓存接口给清理掉，否则将获取不到新数据
         */
        cleans?: string | string[]
        /**
         * 接口在请求发送前调用，可以在该方法内对数据进行加工处理
         */
        before?: (this: Bag, bag: Bag) => void

        /**
         * 接口在成功请求后，在送到view毅调用该方法，可在该方法对数据进行加工处理
         */
        after?: (this: Bag, bag: Bag) => void

        [key: string]: any
    }

    /**
     * 基础触发事件接口
     */
    interface TriggerEventDescriptor {
        /**
         * 事件类型
         */
        readonly type: string
    }
    /**
     * 路由变化事件接口
     */
    interface RouterChangeEvent extends TriggerEventDescriptor {
        /**
         * 拒绝url改变
         */
        reject: () => void

        /**
         * 接受url改变
         */
        resolve: () => void

        /**
         * 阻止url改变
         */
        prevent: () => void
    }
    /**
     * 路由变化后事件接口
     */
    interface RouterChangedEvent extends RouterDiff, TriggerEventDescriptor {

    }
    /**
     * view监听location接口
     */
    interface ViewObserveLocation {
        /**
         * 监听path
         */
        path?: boolean
        /**
         * 监听参数
         */
        params?: string | string[]
    }
    /**
     * 路由对象接口
     */
    interface Router extends Event<Router> {
        /**
         * 解析href的query和hash，默认href为location.href
         * @param url 待解析的url，如果未指定则使用location.href
         */
        parse(url?: string): RouterParse
        /**
         * 当前地址栏中的地址与上一个地址栏中的地址差异对象
         */
        diff(): RouterDiff

        /**
         * 导航到新的地址
         * @param path 路径字符串
         * @param params 参数对象
         * @param replace 是否替换当前的历史记录
         * @param silent 是否是静默更新，不触发change事件
         */
        to(path: string, params?: object, replace?: boolean, silent?: boolean): void

        /**
         * 导航到新的地址
         * @param params 参数对象
         * @param replace 是否替换当前的历史记录
         * @param silent 是否是静默更新，不触发change事件
         */
        to(params: object, empty?: any, replace?: boolean, silent?: boolean): void
        /**
         * url即将改变时发生
         */
        onchange: (this: this, e?: RouterChangeEvent) => void
        /**
         * url改变后发生
         */
        onchanged: (this: this, e?: RouterChangedEvent) => void
    }
    /**
     * 接口服务事件接口
     */
    interface ServiceEvent extends TriggerEventDescriptor {
        /**
         * 数据对象的载体
         */
        readonly bag: Bag
        /**
         * 错误对象，如果有错误发生的话
         */
        readonly error: object | string | null
    }
    /**
     * 继承对象接口
     */
    interface ExtendPropertyDescriptor<T> {
        [key: string]: string | number | undefined | boolean | RegExp | symbol | object | null | ((this: T, ...args: any[]) => any)
    }

    /**
     * 继承方法中的this指向
     */
    type TExtendPropertyDescriptor<T> = ExtendPropertyDescriptor<T> & ThisType<T>;
    /**
     * 继承静态属性
     */
    interface ExtendStaticPropertyDescriptor {
        [key: string]: any
    }

    /**
     * 监控url参数接口
     */
    interface ViewObserveUrl {
        /**
         * 监听参数。逗号分割的字符串，或字符串数组
         */
        params?: string | string[]

        /**
         * 是否监听地址的改变
         */
        path?: boolean
    }
    /**
     * view事件接口
     */
    interface ViewEvent extends TriggerEventDescriptor {
        /**
         * 节点id
         */
        readonly id: string
    }
    /**
     * vframe静态事件接口
     */
    interface VframeStaticEvent extends TriggerEventDescriptor {
        /**
         * vframe对象
         */
        readonly vframe: VframePrototype
    }


    /**
     * 缓存类
     */
    interface CachePrototype {
        /**
         * 设置缓存的资源
         * @param key 缓存资源时使用的key，唯一的key对应唯一的资源
         * @param resource 缓存的资源
         */
        set<TResourceAndReturnType = any>(key: string, resource: TResourceAndReturnType): TResourceAndReturnType

        /**
         * 获取缓存的资源，如果不存在则返回undefined
         * @param key 缓存资源时使用的key
         */
        get<TReturnType = any>(key: string): TReturnType
        /**
         * 从缓存对象中删除缓存的资源
         * @param key 缓存的资源key
         */
        del<TReturnType = any>(key: string): TReturnType
        /**
         * 判断缓存对象中是否包含给定key的缓存资源
         * @param key 缓存的资源key
         */
        has(key: string): boolean
        /**
         * 遍历缓存对象中的所有资源
         * @param callback 回调
         * @param options 回调时传递的额外对象
         */
        each<TResourceType = any, TOptionsType = any>(callback: (resource: TResourceType, options: TOptionsType, cache: this) => void, options?: TOptionsType): void
    }
    /**
     * 缓存类
     */
    interface Cache {
        /**
         * 缓存类
         * @param max 最大缓存个数
         * @param buffer 缓存区个数，默认5
         * @param removedCallback 当缓存的资源被删除时调用
         */
        new(max?: number, buffer?: number, removedCallback?: (this: void, resource: any) => void): CachePrototype
        readonly prototype: CachePrototype
    }


    /**
     * 拥有事件on,off,fire的基类原型
     */
    interface BasePrototype extends Event<BasePrototype> {

    }
    /**
     * 拥有事件on,off,fire的基类
     */
    interface Base {
        /**
         * 初始化
         */
        new(...args: any[]): BasePrototype
        /**
         * 继承Magix.Base
         * @param props 原型方法或属性的对象
         * @param statics 静态方法或属性的对象
         */
        extend<TProps = object, TStatics = object>(props?: TExtendPropertyDescriptor<TProps & BasePrototype>, statics?: TStatics): this & TStatics
        /**
         * 原型
         */
        readonly prototype: BasePrototype
    }

    /**
     * Vframe类原型
     */
    interface VframePrototype extends Event<VframePrototype> {
        /**
         * vframe所在的节点id
         */
        readonly id: string

        /**
         * 渲染的view模块路径，如app/views/default
         */
        readonly path: string

        /**
         * 父vframe id，如果没有则为undefined
         */
        readonly pId: string
        /**
         * 渲染view
         * @param viewPath view模块路径，如app/views/default
         * @param viewInitParams 初始化view时传递的参数，可以在view的init方法中接收
         */
        mountView(viewPath: string, viewInitParams?: object): void
        /**
         * 销毁view
         */
        unmountView(): void

        /**
         * 在某个dom节点上渲染vframe
         * @param id 要渲染的节点id
         * @param viewPath view路径
         * @param viewInitParams 初始化view时传递的参数，可以在view的init方法中接收
         */
        mountVframe(id: string, viewPath: string, viewInitParams?: object): this

        /**
         * 销毁dom节点上渲染的vframe
         * @param id 节点id，默认当前view
         */
        unmountVframe(id?: string): void

        /**
         * 渲染某个节点下的所有子view
         * @param id 节点id，默认当前view
         * @param viewInitParams 初始化view时传递的参数，可以在view的init方法中接收
         */
        mountZone(id?: string, viewInitParams?: object): void

        /**
         * 销毁某个节点下的所有子view
         * @param id 节点id，默认当前view
         */
        unmountZone(id?: string): void

        /**
         * 获取祖先vframe
         * @param level 向上查找层级，默认1级，即父vframe
         */
        parent(level?: number): this | null

        /**
         * 获取当前vframe的所有子vframe的id。返回数组中，id在数组中的位置并不固定
         */
        children(): string[]

        /**
         * 调用vframe的view中的方法
         * @param name 方法名
         * @param args 传递的参数
         */
        invoke<TReturnType>(name: string, args?: any[]): TReturnType
        /**
         * 子孙view创建完成时触发
         */
        oncreated: (this: this, e?: TriggerEventDescriptor) => void

        /**
         * 子孙view修改时触发
         */
        onalter: (this: this, e?: TriggerEventDescriptor) => void
    }
    /**
     * Vframe类，开发者绝对不需要继承、实例化该类！
     */
    interface Vframe extends Event<Vframe> {
        /**
         * 获取当前页面上所有的vframe
         */
        all(): {
            [key: string]: VframePrototype
        }
        /**
         * 根据id获取vframe
         * @param id id
         */
        get(id: string): VframePrototype

        /**
         * 当vframe创建并添加到管理对象上时触发
         */
        onadd: (this: this, e?: VframeStaticEvent) => void

        /**
         * 当vframe销毁并从管理对象上删除时触发
         */
        onremove: (this: this, e?: VframeStaticEvent) => void
        /**
         * 原型
         */
        readonly prototype: VframePrototype
    }
    interface IncrementDiff {
        node: HTMLElement,
        deep: boolean
        data: boolean
        html: boolean
        keys: object
    }
    /**
     * view类原型
     */
    interface ViewPrototype extends Event<ViewPrototype> {
        /**
         * 当前view所在的节点id
         */
        readonly id: string
        /**
         * 模板
         */
        readonly tmpl: string | {
            html: string
            subs: object[]
        }
        /**
         * 持有当前view的vframe
         */
        readonly owner: VframePrototype
        /**
         * 更新界面对象
         */
        readonly updater: Updater
        /**
         * 混入的当前View类原型链上的其它对象
         */
        mixins?: ExtendStaticPropertyDescriptor[]

        /**
         * 初始化View时调用
         * @param extra 初始化时传递的额外参数
         */
        init(extra?: object): void
        /**
         * 渲染界面，开发者在该方法内完成界面渲染的流程
         */
        render(...args: any[]): void
        /**
         * 更新某个节点的html，该方法内部会自动处理相关的子view
         * @param id 设置html的节点id
         * @param html 待设置的html
         */
        assign(data: object, options?: IncrementDiff): boolean

        /**
         * 监听地址栏的改变，如"/app/path?page=1&size=20"，其中"/app/path"为path,"page,size"为参数
         * @param parameters 监听地址栏中的参数，如"page,size"或["page","size"]表示监听page或size的改变
         * @param observePath 是否监听path的改变
         */
        observeLocation(parameters: string | string[], observePath?: boolean): void

        /**
         * 监听地址栏的改变
         * @param observeObject 参数对象
         */
        observeLocation(observeObject: ViewObserveLocation): void
        /**
         * 监听Magix.State中的数据变化
         * @param keys 逗号分割的字符串
         */
        observeState(keys: string): void
        /**
         * 通知当前view某个节点即将开始进行html的更新，在该方法内部会派发prerender事件
         * @param id 哪块区域需要更新，默认当前view
         */
        beginUpdate(id?: string): void
        /**
         * 通知当前view某个节点结束html的更新，在该方法内部会派发rendered事件
         * @param id 哪块区域需要更新，默认当前view
         */
        endUpdate(id?: string): void
        /**
         * 包装异步回调
         * 为什么要包装？
         * 在单页应用的情况下，一些异步(如setTimeout,ajax等)回调执行时，当前view已经被销毁。如果你的回调中去操作了DOM，
         * 则会出错，为了避免这种情况的出现，可以调用该方法包装一次，magix会确保你的回调在view未销毁的情况下被调用
         * @param callback 回调方法
         * @param context 回调方法执行时的this指向
         */
        wrapAsync<TThisType>(callback: (this: TThisType, ...args: any[]) => void, context?: TThisType): Function
        /**
         * 把资源交给当前view托管，当view销毁或重新渲染时自动对托管的资源做处理，即在合适的时候调用资源的destroy方法。返回托管的资源
         * @param key 托管资源的key，当要托管的key已经存在时且要托管的资源与之前的不相同时，会自动销毁之前托管的资源
         * @param resource 托管的资源
         * @param destroyWhenCallRender 当render方法再次调用时，是否自动销毁该资源，通常Magix.Service实例需要在render时自动销毁
         */
        capture<TResourceAndReturnType extends { destroy: () => void }>(key: string, resource?: TResourceAndReturnType, destroyWhenCallRender?: boolean): TResourceAndReturnType
        /**
         * 释放管理的资源。返回托管的资源，无论是否销毁
         * @param key 托管资源的key
         * @param destroy 是否销毁资源，即自动调用资源的destroy方法
         */
        release<TResourceType extends { destroy: () => void }>(key: string, destroy?: boolean): TResourceType
        /**
         * 离开确认方法，需要开发者实现离开的界面和逻辑
         * @param resolve 确定离开时调用该方法，通知magix离开
         * @param reject 留在当前界面时调用的方法，通知magix不要离开
         * @param msg 调用leaveTip时传递的离开消息
         */
        leaveConfirm(resolve: Function, reject: Function, msg: string): void
        /**
         * 离开提醒，比如表单有变化且未保存，我们可以提示用户是直接离开，还是保存后再离开
         * @param msg 离开提示消息
         * @param hasChanged 是否显示提示消息的方法，返回true表示需要提示用户
         */
        leaveTip(msg: string, hasChanged: () => boolean): void

        /**
         * view销毁时触发
         */
        ondestroy: (this: this, e?: TriggerEventDescriptor) => void;

        /**
         * 当render方法被调用时触发
         */
        onrendercall: (this: this, e?: TriggerEventDescriptor) => void;
    }
    /**
     * View类
     */
    interface View {
        /**
         * 继承Magix.View
         * @param props 包含可选的init和render方法的对象
         * @param statics 静态方法或属性的对象
         */
        extend<TProps = object, TStatics = object>(props?: TExtendPropertyDescriptor<TProps & ViewPrototype>, statics?: TStatics): this & TStatics
        /**
         * 扩展到Magix.View原型上的对象
         * @param props 包含可选的ctor方法的对象
         */
        merge(...args: TExtendPropertyDescriptor<ViewPrototype>[]): void
        /**
         * 原型
         */
        readonly prototype: ViewPrototype
    }

    /**
     * 接口管理类原型
     */
    interface ServicePrototype {
        /**
         * 所有请求完成回调done
         * @param metas 接口名称或对象数组
         * @param done 全部接口成功时回调
         */
        all(metas: object[] | string[] | string, done: (this: this, err: any, ...bags: Bag[]) => void): this

        /**
         * 所有请求完成回调done，与all不同的是：如果接口指定了缓存，all会走缓存，而save则不会
         * @param metas 接口名称或对象数组
         * @param done 全部接口成功时回调
         */
        save(metas: object[] | string[] | string, done: (this: this, err: any, ...bags: Bag[]) => void): this

        /**
         * 任意一个成功均立即回调，回调会被调用多次
         * @param metas 接口名称或对象数组
         * @param done 全部接口成功时回调
         */
        one(metas: object[] | string[] | string, done: (this: this, err: any, ...bags: Bag[]) => void): this
        /**
         * 排队，前一个all,one或save任务做完后的下一个任务，类似promise
         * @param callback 当前面的任务完成后调用该回调
         */
        enqueue(callback: (this: this, ...args: any[]) => void): this
        /**
         * 开始处理队列中的下一个任务
         */
        dequeue(...args: any[]): void
        /**
         * 销毁当前请求，不可以继续发起新请求，而且不再调用相应的回调
         */
        destroy(): void
    }
    /**
     * 接口管理类
     */
    interface Service extends Event<Service> {
        /**
         * 继承产生新的Service类
         * @param sync 同步数据的方法，通常在该方法内与服务端交换数据
         * @param cacheMax 最大缓存数
         * @param cacheBuffer 缓存区数量
         */
        extend(sync: (this: void, bag: Bag, callback: (error?: string | object) => void) => void, cacheMax?: number, cacheBuffer?: number): this
        /**
         * 添加接口元信息
         * @param metas 接口元信息数组
         */
        add(metas: ServiceInterfaceMeta[]): void

        /**
         * 根据接口元信息创建bag对象
         * @param meta 接口元信息对象或名称字符串
         */
        create(meta: ServiceInterfaceMeta | string): Bag

        /**
         * 获取元信息对象
         * @param meta 接口元信息对象或名称字符串
         */
        meta(meta: ServiceInterfaceMeta | string): ServiceInterfaceMeta

        /**
         * 从缓存中获取或创意bag对象
         * @param meta 接口元信息对象或名称字符串
         * @param create 是否是创建新的Bag对象，如果否，则尝试从缓存中获取
         */
        get(meta: ServiceInterfaceMeta | string, create: boolean): Bag

        /**
         * 从缓存中清除指定接口的数据
         * @param names 逗号分割的接口名称字符串或数组
         */
        clear(names: string | string[]): void

        /**
         * 从缓存中获取bag对象
         * @param meta 接口元信息对象或名称字符串
         */
        cached(meta: ServiceInterfaceMeta | string): Bag | null

        /**
         * 接口发送请求前触发
         */
        onbegin: (this: this, e?: ServiceEvent) => void;

        /**
         * 接口发送结束时触发，不管请求成功或失败
         */
        onend: (this: this, e?: ServiceEvent) => void;
        /**
         * 初始化
         */
        new(): ServicePrototype
        /**
         * 原型
         */
        readonly prototype: ServicePrototype
    }
    interface Magix {
        /**
         * 设置或获取配置信息
         * @param cfg 配置信息参数对象
         */
        config<T extends object>(cfg: Magix3.Config & T): Magix3.Config & T

        /**
         * 获取配置信息
         * @param key 配置key
         */
        config(key: string): any

        /**
         * 获取配置信息对象
         */
        config<T extends object>(): Magix3.Config & T

        /**
         * 应用初始化入口
         * @param cfg 配置信息参数对象
         */
        boot(cfg: Magix3.Config): void
        /**
         * 把列表转化成hash对象。Magix.toMap([1,2,3,5,6]) => {1:1,2:1,3:1,4:1,5:1,6:1}。Magix.toMap([{id:20},{id:30},{id:40}],'id') => {20:{id:20},30:{id:30},40:{id:40}}
         * @param list 源数组
         * @param key 以数组中对象的哪个key的value做为hash的key
         */
        toMap<T extends object>(list: any[], key?: string): T
        /**
         * 以try catch方式执行方法，忽略掉任何异常。返回成功执行的最后一个方法的返回值
         * @param fns 函数数组
         * @param args 参数数组
         * @param context 在待执行的方法内部，this的指向
         */
        toTry<TReturnType, TContextType>(fns: ((this: TContextType, ...args: any[]) => void) | ((this: TContextType, ...args: any[]) => void)[], args?: any[], context?: TContextType): TReturnType

        /**
         * 以try catch方式执行方法，忽略掉任何异常。返回成功执行的最后一个方法的返回值
         * @param fns 函数数组
         * @param args 参数数组
         * @param context 在待执行的方法内部，this的指向
         */
        toTry<TReturnType>(fns: Function | Function[], args?: any[], context?: any): TReturnType

        /**
         * 转换成字符串路径。Magix.toUrl('/xxx/',{a:'b',c:'d'}) => /xxx/?a=b&c=d
         * @param path 路径
         * @param params 参数对象
         * @param keo 保留空白值的对象
         */
        toUrl(path: string, params?: object, keo?: object): string
        /**
         * 把路径字符串转换成对象。Magix.parseUrl('/xxx/?a=b&c=d') => {path:'/xxx/',params:{a:'b',c:'d'}}
         * @param url 路径字符串
         */
        parseUrl(url: string): Magix3.RouterParseParts

        /**
         * 把source对象的值添加到target对象上
         * @param target 要mix的目标对象
         * @param source mix的来源对象
         */
        mix<T, U>(target: T, source: U): T & U;

        /**
         * 把source对象的值添加到target对象上
         * @param target 要mix的目标对象
         * @param source1 第一个mix的来源对象
         * @param source2 第二个mix的来源对象
         */
        mix<T, U, V>(target: T, source1: U, source2: V): T & U & V;

        /**
         * 把source对象的值添加到target对象上
         * @param target 要mix的目标对象
         * @param source1 第一个mix的来源对象
         * @param source2 第二个mix的来源对象
         * @param source3 第三个mix的来源对象
         */
        mix<T, U, V, W>(target: T, source1: U, source2: V, source3: W): T & U & V & W;

        /**
         * 把source对象的值添加到target对象上
         * @param target 要mix的目标对象
         * @param sources 一个或多个mix的来源对象
         */
        mix(target: object, ...sources: any[]): any;

        /**
         * 检测某个对象是否拥有某个属性。
         * @param owner 检测对象
         * @param prop 属性
         */
        has(owner: object, prop: string | number): boolean

        /**
         * 获取对象的keys
         * @param src 源对象
         */
        keys(src: object): string[]

        /**
         * 判断一个节点是否在另外一个节点内，如果比较的2个节点是同一个节点，也返回true
         * @param node 节点或节点id
         * @param container 容器节点或节点id
         */
        inside(node: HTMLElement | string, container: HTMLElement | string): boolean

        /**
         * document.getElementById的简写
         * @param id 节点id
         */
        node(id: string | HTMLElement): HTMLElement | null

        /**
         * 给节点添加id
         * @param node 节点对象
         */
        nodeId(node: HTMLElement): string

        /**
         * 使用加载器的加载模块功能
         * @param deps 模块id
         * @param callback 回调
         */
        use(deps: string[], callback: (...args: object[]) => any): void

        /**
         * 保护对象不被修改
         * @param o 保护对象
         */
        guard<T extends object>(o: T): T
        /**
         * 排除执行函数，解决卡顿问题
         * @param fn 待执行的函数
         * @param args 向函数传递的参数
         * @param context 执行上下文对象
         */
        task(fn: (...args) => any, args?: any[], context?: object): void
        /**
         * 向页面追加样式
         * @param key 样式对应的唯一key，该key主要防止向页面反复添加同样的样式
         * @param cssText 样式字符串
         */
        applyStyle(key: string, cssText: string): void
        /**
         * 向页面追加样式
         * @param atFile 以@开头的文件路径
         */
        applyStyle(atFile: string): void
        /**
         * 生成唯一的guid
         * @param prefix guid的前缀，默认mx-
         */
        guid(prefix?: string): string
        /**
         * 在某个对象上打标，处理异步问题
         * @param host 打标对象
         * @param signature 标志字符串
         */
        mark(host: Object, signature: String): () => boolean
        /**
         * 取消打标
         * @param host 打标对象
         */
        unmark(host: Object): void
        /**
         * 派发dom事件
         * @param element dom节点对象
         * @param type 事件名称
         * @param data 事件参数
         */
        dispatch(element: HTMLElement | Node, type: string, data?: object): void
        /**
         * 接管管理类
         */
        Service: Magix3.Service

        /**
         * view类
         */
        View: Magix3.View
        /**
         * 缓存类
         */
        Cache: Magix3.Cache
        /**
         * 状态对象
         */
        State: Magix3.State
        /**
         * 事件对象
         */
        Event: Magix3.Event
        /**
         * 路由对象
         */
        Router: Magix3.Router
        /**
         * Vframe类，开发者绝对不需要继承、实例化该类！
         */
        Vframe: Magix3.Vframe

        /**
         * 拥有事件on,off,fire的基类
         */
        Base: Magix3.Base
        default: Magix
    }
}
/**
 * export module
 */
declare module "magix" {
    const Magix: Magix3.Magix
    export = Magix;
}