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

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

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

        /**
         * srcQuery解析出的对象
         */
        query: IRouterParseParts

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

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

        /**
         * 当前url对应的要渲染的根view
         */
        view: string
        /**
         * 从params中获取参数值，当参数不存在时返回空字符串
         */
        get(key: string): string

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

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

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

        /**
         * 都有哪些参数发生变化的对象
         */
        params: {
            [key: string]: IRouterDiffItem
        }
    }
    /**
     * view更新器接口
     */
    interface IUpdater {
        /**
         * 把结果渲染到某个节点上，默认是当前view所在的节点
         * @param id dom节点id
         */
        to(id: string): void

        /**
         * 获取设置的数据，当key未传递时，返回整个数据对象
         * @param key 设置时的数据key
         */
        get<TReturnType>(key?: string): TReturnType
        /**
         * 设置数据
         * @param data 数据对象，如{a:20,b:30}
         */
        set(data?: { [key: string]: any }): void

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

        /**
         * 检测数据变化，更新界面，放入数据后需要显式调用该方法才可以把数据更新到界面
         * @param data 数据对象，如{a:20,b:30}
         */
        digest(data?: { [key: string]: any }): void

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

        /**
         * 检测数据是否有变动
         */
        altered(): boolean
    }
    /**
     * 数据载体接口
     */
    interface IBag {
        /**
         * bag id
         */
        id: string

        /**
         * 从bag中获取数据
         * @param key 数据key，如果未传递则返回整个数据对象
         * @param defaultValue 默认值，如果传递了该参数且从bag中获取到的数据类型如果与defaultValue不一致，则使用defaultValue
         */
        get<TReturnAndDefaultValueType>(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 IStateChangedEvent extends ITriggerEventDescriptor {
        /**
         * 包含哪些数据变化的集合对象
         */
        keys: {
            [key: string]: 1
        }
    }
    /**
     * 状态接口
     */
    interface IState {
        /**
         * 从状态对象中获取数据
         * @param key 数据key，如果未传递则返回整个状态对象
         */
        get<TReturnType>(key?: string): TReturnType
        /**
         * 设置数据
         * @param data 数据对象
         */
        set(data: object): 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}
         */
        digest(data?: object): void

        /**
         * 绑定事件
         * @param name 事件名称
         * @param fn 事件处理函数
         */
        on(name: string, fn: (this: this, e?: ITriggerEventDescriptor) => void): void

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

        /**
         * 派发事件
         * @param name 事件名称
         * @param data 事件参数
         * @param remove 是否移除所有的事件监听
         * @param lastToFirst 是否倒序派发列表中的监听
         */
        fire(name: string, data?: object, remove?: boolean, lastToFirst?: boolean): void

        /**
         * State中的数据发生变化时触发
         */
        onchanged: (this: this, e?: IStateChangedEvent) => void
    }
    /**
     * api注册信息接口
     */
    interface IServiceInterfaceMeta {
        /**
         * 缓存时间，以毫秒为单位
         */
        cache?: number
        /**
         * 添加的接口元信息名称，需要确保在一个Service中唯一
         */
        name: string
        /**
         * 逗号分割的字符串，用来清除其它接口的缓存，如该接口是一个添加新数据的接口，这个接口调用成功后，应该把所有获取相关数据的缓存接口给清理掉，否则将获取不到新数据
         */
        cleans?: string | string[]
        /**
         * 接口在请求发送前调用，可以在该方法内对数据进行加工处理
         */
        before?: (this: IBag, bag: IBag) => void

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

    /**
     * 事件对象接口
     */
    interface IEventEmitter {
        /**
         * 绑定事件
         * @param name 事件名称
         * @param fn 事件处理函数
         */
        on(name: string, fn: (this: this, e?: ITriggerEventDescriptor) => void): void

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

        /**
         * 派发事件
         * @param name 事件名称
         * @param data 事件参数
         * @param remove 是否移除所有的事件监听
         * @param lastToFirst 是否倒序派发列表中的监听
         */
        fire(name: string, data?: object, remove?: boolean, lastToFirst?: boolean): void
    }
    /**
     * 基础触发事件接口
     */
    interface ITriggerEventDescriptor {
        /**
         * 事件类型
         */
        type: string
    }
    /**
     * 路由变化事件接口
     */
    interface IRouterChangeEvent extends ITriggerEventDescriptor {
        /**
         * 拒绝url改变
         */
        reject: () => void

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

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

    }
    /**
     * 路由对象接口
     */
    interface IRouter {
        /**
         * 解析href的query和hash，默认href为location.href
         * @param url 待解析的url，如果未指定则使用location.href
         */
        parse(url?: string): IRouterParse
        /**
         * 当前地址栏中的地址与上一个地址栏中的地址差异对象
         */
        diff(): IRouterDiff

        /**
         * 导航到新的地址
         * @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

        /**
         * 绑定事件
         * @param name 事件名称
         * @param fn 事件处理函数
         */
        on(name: string, fn: (this: this, e?: ITriggerEventDescriptor) => void): void

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

        /**
         * 派发事件
         * @param name 事件名称
         * @param data 事件参数
         * @param remove 是否移除所有的事件监听
         * @param lastToFirst 是否倒序派发列表中的监听
         */
        fire(name: string, data?: object, remove?: boolean, lastToFirst?: boolean): void
        /**
         * url即将改变时发生
         */
        onchange: (this: this, e?: IRouterChangeEvent) => void
        /**
         * url改变后发生
         */
        onchanged: (this: this, e?: IRouterChangedEvent) => void
    }
    /**
     * 接口服务事件接口
     */
    interface IServiceEvent extends ITriggerEventDescriptor {
        /**
         * 数据对象的载体
         */
        bag: IBag
        /**
         * 错误对象，如果有错误发生的话
         */
        error: object | string | null
    }
    /**
     * 对象属性方法调用接口
     */
    interface IPropertyFunctionCall<T> {
        [key: string]: <TReturnType>(this: T, ...args: any[]) => TReturnType
    }
    /**
     * 继承对象接口
     */
    interface IExtendPropertyDescriptor<T> {
        [key: string]: string | number | undefined | boolean | RegExp | symbol | object | null | ((this: T & IPropertyFunctionCall<T>, ...args: any[]) => any)
    }
    /**
     * 监控url参数接口
     */
    interface IViewObserveUrl {
        /**
         * 监听参数。逗号分割的字符串，或字符串数组
         */
        params?: string | string[]

        /**
         * 是否监听地址的改变
         */
        path?: boolean
    }
    /**
     * view事件接口
     */
    interface IViewEvent extends ITriggerEventDescriptor {
        /**
         * 节点id
         */
        id: string
    }
    /**
     * vframe静态事件接口
     */
    interface IVframeStaticEvent extends ITriggerEventDescriptor {
        /**
         * vframe对象
         */
        vframe: Vframe
    }
    /**
     * 设置或获取配置信息
     * @param cfg 配置信息参数对象
     */
    function config(cfg: IConfig): IConfig

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

    /**
     * 获取配置信息对象
     */
    function config(): IConfig

    /**
     * 应用初始化入口
     * @param cfg 配置信息参数对象
     */
    function boot(cfg: IConfig): 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
     */
    function toMap(list: any[], key?: string): object
    /**
     * 以try catch方式执行方法，忽略掉任何异常。返回成功执行的最后一个方法的返回值
     * @param fns 函数数组
     * @param args 参数数组
     * @param context 在待执行的方法内部，this的指向
     */
    function toTry<TReturnType>(fns: Function[], args?: any[], context?: any): TReturnType
    /**
     * 转换成字符串路径。Magix.toUrl('/xxx/',{a:'b',c:'d'}) => /xxx/?a=b&c=d
     * @param path 路径
     * @param params 参数对象
     * @param keo 保留空白值的对象
     */
    function toUrl(path: string, params?: object, keo?: object): string
    /**
     * 把路径字符串转换成对象。Magix.parseUrl('/xxx/?a=b&c=d') => {path:'/xxx/',params:{a:'b',c:'d'}}
     * @param url 路径字符串
     */
    function parseUrl(url: string): IRouterParseParts

    /**
     * 把src对象的值添加到dest对象上
     * @param dest 要mix的目标对象
     * @param src mix的来源对象
     */
    function mix(dest: object, src: object): object

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

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

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

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

    /**
     * 向页面追加样式
     * @param key 样式对应的唯一key，该key主要防止向页面反复添加同样的样式
     * @param cssText 样式字符串
     */
    function applyStyle(key: string, cssText?: string): void

    /**
     * 生成唯一的guid
     * @param prefix guid的前缀，默认mx-
     */
    function guid(prefix?: string): string
    /**
     * 缓存类
     */
    class Cache {
        /**
         * 缓存类
         * @param max 最大缓存个数
         * @param buffer 缓存区个数，默认5
         * @param removedCallback 当缓存的资源被删除时调用
         */
        constructor(max?: number, buffer?: number, removedCallback?: (this: void, resource: any) => void)

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

        /**
         * 获取缓存的资源，如果不存在则返回undefined
         * @param key 缓存资源时使用的key
         */
        get<TReturnType>(key: string): TReturnType
        /**
         * 从缓存对象中删除缓存的资源
         * @param key 缓存的资源key
         */
        del<TReturnType>(key: string): TReturnType
        /**
         * 判断缓存对象中是否包含给定key的缓存资源
         * @param key 缓存的资源key
         */
        has(key: string): boolean
        /**
         * 遍历缓存对象中的所有资源
         * @param callback 回调
         * @param options 回调时传递的额外对象
         */
        each<TResourceType, TOptionsType>(callback: (resource: TResourceType, options: TOptionsType, cache: this) => void, options?: TOptionsType): void
    }

    /**
     * 状态对象
     */
    const State: IState
    /**
     * 事件对象
     */
    const Event: IEventEmitter
    /**
     * 路由对象
     */
    const Router: IRouter

    /**
     * 拥有事件on,off,fire的基类
     */
    class Base {
        /**
         * 继承Magix.Base
         * @param props 原型方法或属性的对象
         * @param statics 静态方法或属性的对象
         */
        static extend(props?: IExtendPropertyDescriptor<Base> & ThisType<Base>, statics?: object): typeof Base
        /**
         * 绑定事件
         * @param name 事件名称
         * @param fn 事件处理函数
         */
        on(name: string, fn: (this: this, e?: ITriggerEventDescriptor) => void): void

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

        /**
         * 派发事件
         * @param name 事件名称
         * @param data 事件参数
         * @param remove 是否移除所有的事件监听
         * @param lastToFirst 是否倒序派发列表中的监听
         */
        fire(name: string, data?: object, remove?: boolean, lastToFirst?: boolean): void
    }

    /**
     * Vframe类，开发者绝对不需要继承、实例化该类！
     */
    class Vframe {
        /**
         * vframe所在的节点id
         */
        id: string

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

        /**
         * 父vframe id，如果没有则为undefined
         */
        pId: string

        /**
         * 获取当前页面上所有的vframe
         */
        static all(): {
            [key: string]: Vframe
        }
        /**
         * 根据id获取vframe
         * @param id id
         */
        static get(id: string): Vframe

        /**
         * 绑定事件
         * @param name 事件名称
         * @param fn 事件处理函数
         */
        static on(name: string, fn: (this: typeof Vframe, e?: ITriggerEventDescriptor) => void): void

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

        /**
         * 派发事件
         * @param name 事件名称
         * @param data 事件参数
         * @param remove 是否移除所有的事件监听
         * @param lastToFirst 是否倒序派发列表中的监听
         */
        static fire(name: string, data?: object, remove?: boolean, lastToFirst?: boolean): void

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

        /**
         * 当vframe销毁并从管理对象上删除时触发
         */
        static onremove: (this: typeof Vframe, e?: IVframeStaticEvent) => void


        /**
         * 渲染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): Vframe

        /**
         * 销毁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): Vframe | null

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

        /**
         * 调用vframe的view中的方法
         * @param name 方法名
         * @param args 传递的参数
         */
        invoke<TReturnType>(name: string, args?: any[]): TReturnType

        /**
         * 绑定事件
         * @param name 事件名称
         * @param fn 事件处理函数
         */
        on(name: string, fn: (this: this, e?: ITriggerEventDescriptor) => void): void

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

        /**
         * 派发事件
         * @param name 事件名称
         * @param data 事件参数
         * @param remove 是否移除所有的事件监听
         * @param lastToFirst 是否倒序派发列表中的监听
         */
        fire(name: string, data?: object, remove?: boolean, lastToFirst?: boolean): void

        /**
         * 子孙view创建完成时触发
         */
        oncreated: (this: this, e?: ITriggerEventDescriptor) => void

        /**
         * 子孙view修改时触发
         */
        onalter: (this: this, e?: ITriggerEventDescriptor) => void
    }

    /**
     * View类
     */
    class View {
        /**
         * 当前view所在的节点id
         */
        id: string
        /**
         * 持有当前view的vframe
         */
        owner: Vframe

        /**
         * 更新界面对象
         */
        updater: IUpdater
        /**
         * 混入的当前View类原型链上的其它对象
         */
        mixins?: string[]
        /**
         * 继承Magix.View
         * @param props 包含可选的init和render方法的对象
         * @param statics 静态方法或属性的对象
         */
        static extend(props?: IExtendPropertyDescriptor<View> & ThisType<View>, statics?: object): typeof View
        /**
         * 扩展到Magix.View原型上的对象
         * @param props 包含可选的ctor方法的对象
         */
        static merge(props: IExtendPropertyDescriptor<View> & ThisType<View>): void
        /**
         * 初始化View时调用
         * @param extra 初始化时传递的额外参数
         */
        init(extra?: object): void
        /**
         * 渲染界面，开发者在该方法内完成界面渲染的流程
         */
        render(): void
        /**
         * 更新某个节点的html，该方法内部会自动处理相关的子view
         * @param id 设置html的节点id
         * @param html 待设置的html
         */
        setHTML(id: string, html: string): void

        /**
         * 监听地址栏的改变，如"/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
        /**
         * 监听Magix.State中的数据变化
         * @param keys 逗号分割的字符串
         */
        observeState(keys: string): void
        /**
         * 包装mx-event事件，比如把mx-click="test({key:'field'})" 包装成 mx-click="magix_vf_root^test({key:'field})"，以方便识别交由哪个view处理
         * @param tmpl 模板字符串
         */
        wrapEvent(tmpl: string): string
        /**
         * 通知当前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 msg 调用leaveTip时传递的离开消息
         * @param resolve 确定离开时调用该方法，通知magix离开
         * @param reject 留在当前界面时调用的方法，通知magix不要离开
         */
        leaveConfirm(msg: string, resolve: Function, reject: Function): void
        /**
         * 离开提醒，比如表单有变化且未保存，我们可以提示用户是直接离开，还是保存后再离开
         * @param msg 离开提示消息
         * @param hasChanged 是否显示提示消息的方法，返回true表示需要提示用户
         */
        leaveTip(msg: string, hasChanged: () => boolean): void
        /**
         * 获取数据，this.updater.get的快捷方式
         * @param key 获取数据的key，如果未提供侧返回整个数据对象
         */
        getData(key?: string): any
        /**
         * 设置数据，this.updater.set的快捷方式
         * @param data 数据对象
         */
        setData(data: object): void
        /**
         * 整理数据并更新界面，this.updater.digest的快捷方式
         * @param data 数据对象
         */
        digestData(data?: object): void
        /**
         * 当前数据的快照，this.updater.snapshot的快捷方式
         */
        snapshotData(): void
        /**
         * 获取当前数据相比于上一次的snapshotData时是否有修改，this.updater.altered的快捷方式
         */
        dataAltered(): boolean

        /**
         * 获取状态数据，Magix.State.get的快捷方式
         * @param key 获取数据的key，如果未提供由是整个state数据对象
         */
        getState(key?: string): any

        /**
         * 设置state数据，Magix.State.set的快捷方式
         * @param data 数据对象
         */
        setState(data: object): void
        /**
         * 整理state数据，如果有变化则触发change事件，Magix.State.digest的快捷方式
         * @param data 数据对象
         */
        digestState(data?: object): void

        /**
         * 获取location对象，Magix.Router.parse的快捷方式
         * @param href 可选的url字符串
         */
        getLocation(href?: string): IRouterParse

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

        /**
         * 导航到新的地址，Magix.Router.to的快捷方式
         * @param params 参数对象
         * @param empty 任意为空的对象，如'',0,null等
         * @param replace 是否替换当前的历史记录
         * @param silent 是否是静默更新，不触发change事件
         */
        toLocation(params: object, empty?: any, replace?: boolean, silent?: boolean): void
        /**
         * 绑定事件
         * @param name 事件名称
         * @param fn 事件处理函数
         */
        on(name: string, fn: (this: this, e?: ITriggerEventDescriptor) => void): void

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

        /**
         * 派发事件
         * @param name 事件名称
         * @param data 事件参数
         * @param remove 是否移除所有的事件监听
         * @param lastToFirst 是否倒序派发列表中的监听
         */
        fire(name: string, data?: object, remove?: boolean, lastToFirst?: boolean): void

        /**
         * 当view调用setHTML刷新某个节点前触发
         */
        onprerender: (this: this, e?: IViewEvent) => void;

        /**
         * 当view调用setHTML刷新某个节点后触发
         */
        onrendered: (this: this, e?: IViewEvent) => void;

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

        /**
         * 当render方法被调用时触发
         */
        onrendercall: (this: this, e?: ITriggerEventDescriptor) => void;
    }

    /**
     * 接口管理类
     */
    class Service {
        /**
         * 继承产生新的Service类
         * @param sync 同步数据的方法，通常在该方法内与服务端交换数据
         * @param cacheMax 最大缓存数
         * @param cacheBuffer 缓存区数量
         */
        static extend(sync: (this: void, bag: IBag, callback: (error?: string | object) => void) => void, cacheMax?: number, cacheBuffer?: number): typeof Service
        /**
         * 添加接口元信息
         * @param metas 接口元信息数组
         */
        static add(metas: IServiceInterfaceMeta[]): void

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

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

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

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

        /**
         * 从缓存中获取bag对象
         * @param meta 接口元信息对象或名称字符串
         */
        static cached(meta: IServiceInterfaceMeta | string): IBag | null
        /**
         * 派发事件
         * @param name 事件名称
         * @param data 事件参数
         * @param remove 是否移除所有的事件监听
         * @param lastToFirst 是否倒序派发列表中的监听
         */
        static fire(name: string, data?: object, remove?: boolean, lastToFirst?: boolean): void

        /**
         * 绑定事件
         * @param name 事件名称
         * @param fn 事件处理函数
         */
        static on(name: string, fn: (this: typeof Service, e?: ITriggerEventDescriptor) => void): void

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

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

        /**
         * 接口发送结束时触发，不管请求成功或失败
         */
        static onend: (this: typeof Service, e?: IServiceEvent) => void;

        /**
         * 接口发送请求失败时触发
         */
        static onfail: (this: typeof Service, e?: IServiceEvent) => void;

        /**
         * 接口发送请求成功时触发
         */
        static ondone: (this: typeof Service, e?: IServiceEvent) => void;
        /**
         * 所有请求完成回调done
         * @param metas 接口名称或对象数组
         * @param done 全部接口成功时回调
         */
        all(metas: object[] | string[] | string, done: (this: this, err: any, ...bags: IBag[]) => void): Service

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

        /**
         * 任意一个成功均立即回调，回调会被调用多次
         * @param metas 接口名称或对象数组
         * @param done 全部接口成功时回调
         */
        one(metas: object[] | string[] | string, done: (this: this, err: any, ...bags: IBag[]) => void): Service
        /**
         * 排队，前一个all,one或save任务做完后的下一个任务，类似promise
         * @param callback 当前面的任务完成后调用该回调
         */
        enqueue(callback: (this: this, ...args: any[]) => void): Service
        /**
         * 开始处理队列中的下一个任务
         */
        dequeue(...args: any[]): void
        /**
         * 销毁当前请求，不可以继续发起新请求，而且不再调用相应的回调
         */
        destroy(): void
    }
}
