Skip to content
虚位以待
虚位以待
虚位以待
虚位以待
虚位以待
虚位以待
虚位以待
虚位以待
虚位以待
虚位以待
虚位以待
虚位以待
虚位以待
虚位以待
虚位以待
虚位以待
虚位以待
虚位以待

全局 .d.ts

全局库

全局库是指可以从全局作用域访问的库(即无需使用任何形式的 import)。 许多库只是暴露一个或多个全局变量供使用。 例如,如果你使用 jQuery,可以直接通过引用 $ 变量来使用它:

ts
$(() => {
  console.log("hello!");
});

你通常会在全局库的文档中看到如何在 HTML script 标签中使用该库的说明:

html
<script src="http://a.great.cdn.for/someLib.js"></script>

如今,大多数流行的全局可访问库实际上都是作为 UMD 库编写的(见下文)。 UMD 库的文档很难与全局库的文档区分开来。 在编写全局声明文件之前,请确保该库实际上不是 UMD。

从代码识别全局库

全局库代码通常极其简单。 一个全局的“Hello, world”库可能看起来像这样:

js
function createGreeting(s) {
  return "Hello, " + s;
}

或者像这样:

js
window.createGreeting = function (s) {
  return "Hello, " + s;
};

在查看全局库的代码时,你通常会看到:

  • 顶层 var 语句或 function 声明
  • window.someName 的一次或多次赋值
  • 假定存在 documentwindow 等 DOM 原语

不会看到:

  • 检查或使用模块加载器(如 requiredefine
  • 形式为 var fs = require("fs"); 的 CommonJS/Node.js 风格导入
  • 调用 define(...)
  • 描述如何 require 或导入库的文档

全局库示例

由于将全局库转换为 UMD 库通常很容易,因此很少有流行的库仍然采用全局风格编写。 然而,那些较小且依赖 DOM(或没有依赖项)的库可能仍然是全局的。

全局库模板

你可以在下面看到一个 DTS 示例:

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

/*~ 如果此库是可调用的(例如,可以作为 myLib(3) 调用),
 *~ 请在此处包含这些调用签名。
 *~ 否则,删除此部分。
 */
declare function myLib(a: string): string;
declare function myLib(a: number): number;

/*~ 如果你希望此库的名称成为一个有效的类型名称,
 *~ 你可以在此处进行。
 *~
 *~ 例如,这允许我们编写 'var x: myLib';
 *~ 请确保这确实有意义!如果没有意义,只需
 *~ 删除此声明并将类型添加到下面的命名空间中。
 */
interface myLib {
  name: string;
  length: number;
  extras?: string[];
}

/*~ 如果你的库在全局变量上暴露了属性,
 *~ 请将它们放在这里。
 *~ 你还应将类型(接口和类型别名)放在这里。
 */
declare namespace myLib {
  //~ 我们可以写 'myLib.timeout = 50;'
  let timeout: number;

  //~ 我们可以访问 'myLib.version',但不能更改它
  const version: string;

  //~ 有一个我们可以通过 'let c = new myLib.Cat(42)' 创建的类
  //~ 或者引用,例如 'function f(c: myLib.Cat) { ... }'
  class Cat {
    constructor(n: number);

    //~ 我们可以从 'Cat' 实例读取 'c.age'
    readonly age: number;

    //~ 我们可以从 'Cat' 实例调用 'c.purr()'
    purr(): void;
  }

  //~ 我们可以声明变量为
  //~   '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)' 或 'myLib.checkCat(c, v);'
  function checkCat(c: Cat, s?: VetID);
}