TypeScript 中如何编写声明文件?

文将循序渐进教大家如何给现有项目中的 JavaScript 代码「编写声明文件」

1. 描述全局命名空间对象

全局变量 myLib 上有一个函数 makeGreeting 用于创建问候语,以及一个属性numberOfGreetings,表示到目前为止已经制作的问候语数量。

代码案例

let result = myLib.makeGreeting('hello world');
console.log('greeting: ', result);

let count = myLib.numberOfGreetings;

声明方式

  • 通过 declare namespace 声明命名空间
  • 在命名空间内部({})声明函数类型和变量类型(用分号 ; 隔开),描述命名空间下可以访问的函数或值(通过点运算符(dotted notation))。
declare namespace myLib {
  function makeGreeting(s: string): string;
  let numberOfGreetings: number;
}

2. 描述全局变量和函数

全局变量 foo 表示 widgets 展现次数。

全局函数 greet 可以接受字符串参数调用,向用户展示问候信息

代码案例

console.log("Half the number of widgets is " + foo / 2);
greet3("hello, world");

声明方式

  • 使用 declare var 声明全局变量
  • 使用 declare function 声明全局函数
declare var foo: number;
declare function greet3(s: string): string;

3. 描述重载函数

所谓重载函数(Overloaded Functions),即函数调用方式不止一种。

getWidget 函数接受一个数字并返回一个 Widget,或者接受一个字符串并返回一个Widget 数组。

代码案例

let x = getWidget(43);
let arr = getWidget('all of them');

声明方式

因为不是声明命名空间,而是一个全局函数,所以使用 declare function 就行。

declare function getWidget(n: number): Widget;
declare function getWidget(s: string): Widget[];

4. 描述函数的对象类型参数

调用 greet 函数时,您必须传递一个 GreetingSettings 对象。该对象具有以下属性:

  1. greeting:必填字符串

  2. duration:可选时间长度(以毫秒为单位)

  3. color:可选字符串,例如‘#ff00ff’

代码案例

greet({
  greeting'hello world',
  duration4000
});

声明方式

  • GreetingSettings 是个对象类型,所以要使用 interface 声明了
  • greet 函数依旧使用 declare function 声明
interface GreetingSettings {
  greeting: string;
  duration?: number;
  color?: string;
}

declare function greet(settings: GreetingSettings): void;

5. 描述函数的联合类型参数

调用 greet 函数时,您可以提供一个字符串、或返回字符串的函数、或 Greeter 实例。

代码案例

greet2(() => '');
greet2('hello');

声明方式

  • greet 函数依旧使用 declare function 声明
  • 其参数 GreetingLike 是个联合类型
type GreetingLike = string | (() => string);

declare function greet2(settings: GreetingLike): void;

6. 描述类(构造函数、属性和方法)

创建 Greeter2 类的实例对象 myGreeter, 支持扩展 Greeter2 类型(比如 SpecialGreeter)的方式创建自定义 greeter 对象。

代码案例

const myGreeter = new Greeter2('hello world');
myGreeter.greeting = 'howdy';
myGreeter.showGreeting();

class SpecialGreeter extends Greeter2 {
  constructor() {
    super('Very special greeting');
  }
}

声明方式

本题我们会借用 declare class 描述 class 或类 class 对象。有属性、有方法还有构造函数。

declare class Greeter2 {
  constructor(s: string);

  greeting: string;
  showGreeting(): void;
}

7. 描述类实例上方法的参数

greeter 对象可以记录到文件方法(.log())或显示提示方法(.alert())。可以向 .log(...) 提供 LogOptions 并向 .alert(...) 提供 AlertOptions

代码案例

const g = new Greeter('hello world');
g.log({ verbosetrue });
g.alert({ modalfalsetitle'Current Greeting' });

声明方式

LogOptionsAlertOptions 也可以通过 declare namespace 方式声明的,与在“描述全局命名空间对象”中不同的是,前者只声明了类型,后者则是声明了函数/变量。

declare namespace myLib {
  interface LogOptions {
    verbose: boolean;
  }
  
  interface AlertOptions {
    modal: boolean;
    title: string;
  }
}

declare class Greeter {
  constructor(s: string);

  log(logOptions: myLib.LogOptions): void;
  alert(alertOptions: myLib.AlertOptions): void;
}

参考

  • https://www.typescriptlang.org/docs/handbook/declaration-files/by-example.html


原文始发于微信公众号(写代码的宝哥):TypeScript 中如何编写声明文件?

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/244041.html

(0)
小半的头像小半

相关推荐

发表回复

登录后才能评论
极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!