我们在使用非 TS 编写的第三方类库时,必须为这个类库编写声明文件,对外暴露它的 API。有时候,类库的声明文件是包含在源码中的,有时候是单独提供的,需要额外的安装。大多数类库的声明文件,社区已经为我们编写好了。
安装社区声明文件
安装声明文件的方法是:
npm i @types/[包的名称] -D
在 TS 中使用一个外部类库时:
- 首先要考虑是否有这个声明文件,查询方式:TypeSearch
- 如果没有,则需要自己编写,也是为社区做贡献。参考:如何编写声明文件
编写声明文件
内置对象增加属性或方法
增加 global.d.ts 文件
interface Number {
aa: number; // 增加属性
}
全局类库
对于一个全局类库:
function globalLib(options) {
console.log(options);
}
global.version = '1.0.0';
global.doSomething = function () {
console.log('do something');
};
然后创建声明文件: xxx.d.ts
declare function globalLib(options: globalLib.Options):void;
declare namespace globalLib {
const version: string;
function doSomething(): void;
interface Options {
[key: string]: any;
}
}
模块类库
对于一个模块类库:commonJS 模块
const version = '1.0.0';
function doSomething() {
console.log('do something');
}
function moduleLib(options) {
console.log(options)
}
moduleLib.version = version;
moduleLib.doSomething = doSomething;
module.exports = moduleLib;
然后创建声明文件:
declare function moduleLib(options: Options): void;
interface Options {
[key: string]: any;
}
declare namespace moduleLib {
const version: string;
function doSomething(): void;
}
export = moduleLib;
umd 库
对于一个 umd 库:
(function (root, factory) {
if (typeof define === 'function' && define.amd) {
define(factory);
} else if (typeof module === 'object' && module.exports) {
module.exports = factory();
} else {
root.umdLib = factory();
}
})(this, function () {
return {
version: '1.0.1',
doSomething() {
console.log('do something')
}
}
})
然后创建声明文件:
declare namespace umdLib {
const version: string;
function doSomething(): void;
}
export as namespace umdLib;
export = umdLib;
在类库中添加属性
当我们需要给一个类库添加自定义的属性时
// 给模块的类库添加
import m from 'moment';
declare module 'momenrt' {
export function myFunction():void;
}
m.myFunction = () => {}
// 给全局的类库添加
declare global {
namespace globalLib {
function doAnything():void
}
}