类库一般分为三类:全局类库、模块类库、umd类库。
jquery是umd类库,即可以通过全局方式引用,通过webpack的插件实现,也可以通过模块化的方式来引用。
全局类库声明文件
declare function globalLib(options: globalLib.Options): void;
declare namespace globalLib {
const version: string;
function doSomething(): void;
interface Options {
[key: string]: any
}
}
// declare关键字可以为一个外部变量提供类型声明
模块类库声明文件
declare function moduleLib(options: Options): void
interface Options {
[key: string]: any
}
declare namespace moduleLib {
const version: string
function doSomething(): void
}
export = moduleLib
umd类库声明文件
declare namespace umdLib {
const version: string
function doSomething():void
}
export as namespace umdLib
export = umdLib
入口文件
import $ from 'jquery'
// 无法找到xxx声明文件,在ts中,使用非ts类库时,必须为这个类库编写一个声明文件,对外暴露它的API,有时,它的声明文件是包含在它的源码中,但有时是单独提供需要额外安装的
// 安装类声明包:@types/jquery
$('.app').css('color','red')
/*
我们在使用外部类库时,需要查询一下有没有声明文件:http://microsoft.github.io/TypeSearch
http://definitelytyped.org/guides //如何贡献声明文件
*/
globalLib({x: 1})
globalLib.doSomething()
import moduleLib from './module-lib'
moduleLib.doSomething()
import umdLib from './umd-lib'
// 如果注释上面,开启allowUmdGlobalAccess配置则解决问题
umdLib.doSomething()
// 给外部模块增加自定义方法
import m from 'moment'
declare module 'moment' {
export function myFunction(): void
}
m.myFunction = () => {}
declare global {
namespace globalLib {
function doAnything(): void
}
}
// 这样会给全局命名空间造成污染,一般不建议这样做
globalLib.doSomething = () => {}
// 声明文件之间的依赖