// Type definitions for [~THE LIBRARY NAME~] [~OPTIONAL VERSION NUMBER~]
// Project: [~THE PROJECT NAME~]
// Definitions by: [~YOUR NAME~] <[~A URL FOR YOU~]>

// import EditorJS from "@editorjs/editorjs";

/*~ If this library is callable (e.g. can be invoked as myLib(3)),
 *~ include those call signatures here.
 *~ Otherwise, delete this section.
 */
// declare function myLib(a: string): string;
// declare function myLib(a: number): number;

// /*~ If you want the name of this library to be a valid type name,
//  *~ you can do so here.
//  *~
//  *~ For example, this allows us to write 'var x: myLib';
//  *~ Be sure this actually makes sense! If it doesn't, just
//  *~ delete this declaration and add types inside the namespace below.
//  */
// interface myLib {
//   name: string;
//   length: number;
//   extras?: string[];
// }

// interface Window {
//   EditorJS: EditorJS;
// }

// TS有用。JS没用。
// interface Window {
//   test: string;
//  }

//  declare var ee: EditorJS;

 
 // JS可用。 window.gee
//  declare global {
//    var gee: EditorJS;

//    // 或者
//    interface Window {
//     gtest: string;
//    }
//  }

// /*~ If your library has properties exposed on a global variable,
//  *~ place them here.
//  *~ You should also place types (interfaces and type alias) here.
//  */
// declare namespace myLib {
//   //~ We can write 'myLib.timeout = 50;'
//   let timeout: number;

//   //~ We can access 'myLib.version', but not change it
//   const version: string;

//   //~ There's some class we can create via 'let c = new myLib.Cat(42)'
//   //~ Or reference e.g. 'function f(c: myLib.Cat) { ... }
//   class Cat {
//     constructor(n: number);

//     //~ We can read 'c.age' from a 'Cat' instance
//     readonly age: number;

//     //~ We can invoke 'c.purr()' from a 'Cat' instance
//     purr(): void;
//   }

//   //~ We can declare a variable as
//   //~   'var s: myLib.CatSettings = { weight: 5, name: "Maru" };'
//   interface CatSettings {
//     weight: number;
//     name: string;
//     tailLength?: number;
//   }

//   //~ We can write 'const v: myLib.VetID = 42;'
//   //~  or 'const v: myLib.VetID = "bob";'
//   type VetID = string | number;

//   //~ We can invoke 'myLib.checkCat(c)' or 'myLib.checkCat(c, v);'
//   function checkCat(c: Cat, s?: VetID);
// }

import Vue from "vue";
import { AxiosInstance, AxiosRequestConfig } from "axios";

// 可惜内部代码不能通过此类型推导
//import * as api from "./api";
declare module '*.vue' {
  import Vue from 'vue'
  export default Vue
}
declare module "vue/types/vue" {
  interface Vue {
    $http: AxiosInstance;
    // $api: api;
    /** @param cause "?cause=正常退出" */
    logout(cause?: string): Promise;
     /**
     * 会在 beforeDestory 中自动清除
     * @param {function} fn 要执行的函数
     * @param {number} interval 执行间隔ms
     */
    addInterval(fn: Function, interval: number): void;
     /**
     * 会在 beforeDestory 中自动清除
     * @param {function} fn 要执行的函数
     * @param {number} interval 执行间隔ms
     */
    addTimeout(fn: Function, interval: number): void;
  }
}

declare module "axios/index" {
  interface AxiosRequestConfig {
    noErrorMessage?: boolean | false;
  }
}