代码库结构
一般来讲,组织声明文件的方式取决于代码库是如何被使用的。
在 JavaScript 中一个代码库有很多使用方式,这就需要你书写声明文件去匹配它们。
这篇指南涵盖了如何识别常见代码库的模式,以及怎样书写符合相应模式的声明文件。
针对代码库的每种主要的组织模式,在模版一节都有对应的文件。
你可以利用它们帮助你快速上手。
识别代码库的类型
首先,我们先看一下 TypeScript 声明文件能够表示的库的类型。
这里会简单展示每种类型的代码库的使用方式,以及如何去书写,还有一些真实案例。
识别代码库的类型是书写声明文件的第一步。
我们将会给出一些提示,关于怎样通过代码库的使用方法及其源码来识别库的类型。
根据库的文档及组织结构的不同,在这两种方式中可能一个会比另外的一个简单一些。
我们推荐你使用任意你喜欢的方式。
你应该寻找什么?
在为代码库编写声明文件时,你需要问自己以下几个问题。
-
如何获取代码库?
比如,是否只能够从 npm 或 CDN 获取。
-
如何导入代码库?
它是否添加了某个全局对象?它是否使用了
require
或import
/export
语句?
针对不同类型的代码库的示例
模块化代码库
几乎所有的 Node.js 代码库都属于这一类。
这类代码库只能工作在有模块加载器的环境下。
比如,express
只能在 Node.js 里工作,所以必须使用 CommonJS 的require
函数加载。
ECMAScript 2015(也就是 ES2015,ECMAScript 6 或 ES6),CommonJS 和 RequireJS 具有相似的导入一个模块的写法。
例如,对于 JavaScript CommonJS (Node.js),写法如下:
var fs = require('fs');
对于 TypeScript 或 ES6,import
关键字也具有相同的作用:
import * as fs from 'fs';
你通常会在模块化代码库的文档里看到如下说明:
var someLib = require('someLib');
或
define(..., ['someLib'], function(someLib) {
});
与全局模块一样,你也可能会在 UMD 模块的文档里看到这些例子,因此要仔细查看源码和文档。
从代码上识别模块化代码库
模块化代码库至少会包含以下代表性条目之一:
- 无条件的调用
require
或define
- 像
import * as a from 'b';
或export c;
这样的声明 - 赋值给
exports
或module.exports
它们极少包含:
- 对
window
或global
的赋值
模块化代码库的模版
有以下四个模版可用:
你应该先阅读module.d.ts
以便从整体上了解它们的工作方式。
然后,若一个模块可以当作函数调用,则使用module-function.d.ts
。
const x = require('foo');
// Note: calling 'x' as a function
const y = x(42);
如果一个模块可以使用new
来构造,则使用module-class.d.ts