5分钟Typscript - 定义全局变量

142 阅读1分钟

全局库模版

想要具体的模版可以看官网链接 这里就直接拿官网的模板展示一下怎么写全局库/变量的类型定义

// declare 关键字能让你给变量定义,而不必进行赋值
// 全局函数写法
declare function myLib(a: string): string;
declare function myLib(a: number): number;

// 全局接口写法
interface myLib {
  name: string;
  length: number;
  extras?: string[];
}

// 具有全局作用域写法
declare namespace myLib {
  let timeout: number; // 可以赋值 'myLib.timeout = 50;'
  const version: string; // 只读 'myLib.version'
  // 类的写法
  // 创建:'let c = new myLib.Cat(42)'
  // 引用:'function f(c: myLib.Cat) { ... }'
  class Cat {
    constructor(n: number);
    readonly age: number; // 读取实例属性 'c.age'
    purr(): void; // 调用实例方法 'c.purr()'
  }
  // 具有作用域的接口 'var s: myLib.CatSettings = { weight: 5, name: "Maru" };'
  interface CatSettings {
    weight: number;
    name: string;
    tailLength?: number;
  }
  // 具有作用域的类型 'const v: myLib.VetID = 42;' 或者 'const v: myLib.VetID = "bob";'
  type VetID = string | number;
  // 具有作用域的函数 'myLib.checkCat(c)' or 'myLib.checkCat(c, v);'
  // 作用域内部的定义可以直接引用,无需添加作用域前缀
  function checkCat(c: Cat, s?: VetID): void;
  
  // 作用域套娃
  namespace nestedLib {
    type Dog = string // 'const d:myLib.nestedLib.Dog = "someDog";'
    // 在引用父级作用域的东西也不用前缀,就和JS函数作用域一样
    // 'const v:myLib.nestedLib.DogVetID = "someID";'
    type DogVetID = VetID;
  }
}

// 另一种套娃的写法是
declare namesapce myLib.nestedLib2 {
  // ...
}