全局 .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的一次或多次赋值 - 假定存在
document或window等 DOM 原语
你不会看到:
- 检查或使用模块加载器(如
require或define) - 形式为
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);
}