本文循序渐进教向大家如何给现有项目中 JavaScript 的代码「编写声明文件」。
全局变量 myLib 上有一个函数 makeGreeting 用于创建问候语,以及一个属性numberOfGreetings,表示到目前为止已经制作的问候语数量。
通过 declare namespace
声明命名空间
(资料图)
在命名空间内部({}
)声明函数类型和变量类型(用分号 ;
隔开),描述命名空间下可以访问的函数或值(通过点运算符(dotted notation))。
全局变量
foo
表示 widgets 展现次数。全局函数
greet
可以接受字符串参数调用,向用户展示问候信息
使用 declare var
声明全局变量
使用 declare function
声明全局函数
所谓重载函数(Overloaded Functions),即函数调用方式不止一种。
getWidget 函数接受一个数字并返回一个 Widget,或者接受一个字符串并返回一个Widget 数组。
因为不是声明命名空间,而是一个全局函数,所以使用 declare function
就行。
调用 greet 函数时,您必须传递一个 GreetingSettings 对象。该对象具有以下属性:
1. greeting:必填字符串
2. duration:可选时间长度(以毫秒为单位)
3. color:可选字符串,例如‘#ff00ff’
GreetingSettings
是个对象类型,所以要使用 interface
声明了
greet
函数依旧使用 declare function
声明
调用 greet 函数时,您可以提供一个字符串、或返回字符串的函数、或 Greeter 实例。
greet
函数依旧使用 declare function
声明
其参数 GreetingLike
是个联合类型
创建
Greeter2
类的实例对象myGreeter
, 支持扩展Greeter2
类型(比如SpecialGreeter
)的方式创建自定义 greeter 对象。
本题我们会借用 declare class
描述 class 或类 class 对象。有属性、有方法还有构造函数。
greeter 对象可以记录到文件方法(
.log()
)或显示提示方法(.alert()
)。 可以向.log(...)
提供LogOptions
并向.alert(...)
提供AlertOptions
LogOptions
和 AlertOptions
也可以通过 declare namespace
方式声明的,与在“描述全局命名空间对象”中不同的是,前者只声明了类型,后者则是声明了函数/变量。
https://www.typescriptlang.org/docs/handbook/declaration-files/by-example.html