@@ -42,7 +42,7 @@ jQuery('#foo');
42
42
通常我们会把声明语句放到一个单独的文件(` jQuery.d.ts ` )中,这就是声明文件:
43
43
44
44
``` ts
45
- // jQuery.d.ts
45
+ // src/ jQuery.d.ts
46
46
47
47
declare var jQuery: (selector : string ) => any ;
48
48
```
@@ -51,6 +51,15 @@ declare var jQuery: (selector: string) => any;
51
51
52
52
一般来说,ts 会解析项目中所有的 ` *.ts ` 文件,当然也包含以 ` .d.ts ` 结尾的文件。所以当我们将 ` jQuery.d.ts ` 放到项目中时,其他所有 ` *.ts ` 文件就都可以获得 ` jQuery ` 的类型定义了。
53
53
54
+ ```
55
+ /path/to/project
56
+ ├── README.md
57
+ ├── src
58
+ | ├── index.ts
59
+ | └── jQuery.d.ts
60
+ └── tsconfig.json
61
+ ```
62
+
54
63
假如仍然无法解析,那么可以检查下 ` tsconfig.json ` 中的 ` files ` 、` include ` 和 ` exclude ` 配置,确保其包含了 ` jQuery.d.ts ` 文件。
55
64
56
65
这里只演示了全局变量这种模式的声明文件,假如是通过模块导入的方式使用第三方库的话,那么引入声明文件又是另一种方式了,将会在后面详细介绍。
@@ -81,7 +90,7 @@ npm install @types/jquery --save-dev
81
90
- npm 包:通过 ` import foo from 'foo' ` 导入,符合 ES6 模块规范
82
91
- UMD 库:既可以通过 ` <script> ` 标签引入,又可以通过 ` import ` 导入
83
92
- 模块插件:通过 ` import ` 导入后,可以改变另一个模块的结构
84
- - 直接修改全局变量:通过 ` <script> ` 标签引入后,改变一个全局变量的结构。比如为 ` Array .prototype` 新增了一个方法
93
+ - 直接修改全局变量:通过 ` <script> ` 标签引入后,改变一个全局变量的结构。比如为 ` String .prototype` 新增了一个方法
85
94
- 通过导入修改全局变量:通过 ` import ` 导入后,可以改变一个全局变量的结构
86
95
87
96
### 全局变量
@@ -308,7 +317,7 @@ jQuery.fn.extend({
308
317
除了全局变量之外,有一些类型我们可能也希望能暴露出来。在类型声明文件中,我们可以直接使用 ` interface ` 或 ` type ` 来声明一个全局的类型:
309
318
310
319
``` ts
311
- // jQuery.d.ts
320
+ // src/ jQuery.d.ts
312
321
313
322
interface AjaxSettings {
314
323
method? : ' GET' | ' POST'
@@ -322,7 +331,7 @@ declare namespace jQuery {
322
331
这样的话,在其他文件中也可以使用这个接口了:
323
332
324
333
``` ts
325
- // index.ts
334
+ // src/ index.ts
326
335
327
336
let settings: AjaxSettings = {
328
337
method: ' POST' ,
@@ -340,7 +349,7 @@ jQuery.ajax('/api/post_something', settings);
340
349
暴露在最外层的 ` interface ` 或 ` type ` 会作为全局类型作用于整个项目中,我们应该尽可能的减少全局变量或全局类型的数量。故应该将他们放到 ` namespace ` 下:
341
350
342
351
``` ts
343
- // jQuery.d.ts
352
+ // src/ jQuery.d.ts
344
353
345
354
declare namespace jQuery {
346
355
interface AjaxSettings {
@@ -354,7 +363,7 @@ declare namespace jQuery {
354
363
注意,在使用这个 ` interface ` 的时候,也应该加上 ` jQuery ` 前缀了:
355
364
356
365
``` ts
357
- // index.ts
366
+ // src/ index.ts
358
367
359
368
let settings: jQuery .AjaxSettings = {
360
369
method: ' POST' ,
@@ -367,7 +376,7 @@ jQuery.ajax('/api/post_something', settings);
367
376
368
377
#### 声明合并
369
378
370
- 假如 jQuery 既是一个函数,可以直接被调用( ` jQuery('#foo') ` ) ,又是一个对象,拥有子属性( ` jQuery.ajax() ` ) (事实确实如此),则我们可以组合多个声明语句,它们会不冲突的合并起来:
379
+ 假如 jQuery 既是一个函数,可以直接被调用 ` jQuery('#foo') ` ,又是一个对象,拥有子属性 ` jQuery.ajax() ` (事实确实如此),则我们可以组合多个声明语句,它们会不冲突的合并起来:
371
380
372
381
``` ts
373
382
declare function jQuery(selector : string ): any ;
@@ -395,7 +404,7 @@ jQuery.ajax('/api/get_something');
395
404
1 . 创建一个 ` node_modules/@types/foo/index.d.ts ` 文件,存放 ` foo ` 模块的声明文件。这种方式不需要额外的配置,但是 ` node_modules ` 目录不稳定,代码也没有被保存到仓库中,无法回溯版本,有不小心被删除的风险。
396
405
2 . 创建一个 ` types ` 目录,专门用来管理自己写的声明文件,将 ` foo ` 的声明文件放到 ` types/foo/index.d.ts ` 中。这种方式需要配置下 ` tsconfig.json ` 的 ` paths ` 和 ` baseUrl ` 字段。
397
406
398
- ` types ` 目录 :
407
+ 目录结构 :
399
408
400
409
```
401
410
/path/to/project
@@ -522,7 +531,7 @@ export namespace foo {
522
531
```
523
532
524
533
``` ts
525
- // index.ts
534
+ // src/ index.ts
526
535
527
536
import { foo } from ' foo' ;
528
537
@@ -543,7 +552,7 @@ export default function foo(): string;
543
552
```
544
553
545
554
``` ts
546
- // index.ts
555
+ // src/ index.ts
547
556
548
557
import foo from ' foo' ;
549
558
@@ -636,7 +645,7 @@ declare namespace foo {
636
645
637
646
准确地讲,` export = ` 不仅可以用在声明文件中,也可以用在普通的 ts 文件中。实际上,` import ... require ` 和 ` export = ` 都是 ts 为了兼容 AMD 规范和 commonjs 规范而创立的新语法,由于并不常用也不推荐使用,所以这里就不详细介绍了,感兴趣的可以看[ 官方文档] ( https://www.typescriptlang.org/docs/handbook/modules.html#export--and-import--require ) 。
638
647
639
- 由于很多第三方库是 commonjs 规范的,所以声明文件也就不得不用到 ` export = ` 这种语法了。但是还是需要强调下 ,相比与 ` export = ` ,我们更推荐使用 ES6 标准的 ` export default ` 和 ` export ` 。
648
+ 由于很多第三方库是 commonjs 规范的,所以声明文件也就不得不用到 ` export = ` 这种语法了。但是还是需要再强调下 ,相比与 ` export = ` ,我们更推荐使用 ES6 标准的 ` export default ` 和 ` export ` 。
640
649
641
650
### UMD 库
642
651
@@ -692,11 +701,11 @@ interface String {
692
701
693
702
### 通过导入修改全局变量
694
703
695
- 如之前所说,对于一个 npm 包或者 UMD 库的声明文件,只有 ` export ` 导出的类型声明才会有效。所以对于 npm 包或 UMD 库,如果导入此库之后会修改全局变量,则需要使用另一种语法在声明文件中修改全局变量的类型,那就是 ` declare global `
704
+ 如之前所说,对于一个 npm 包或者 UMD 库的声明文件,只有 ` export ` 导出的类型声明才会有效。所以对于 npm 包或 UMD 库,如果导入此库之后会修改全局变量,则需要使用另一种语法在声明文件中修改全局变量的类型,那就是 ` declare global ` 。
696
705
697
706
#### ` declare global `
698
707
699
- 我们将直接修改全局变量的部分, 使用 ` declare global ` 包起来即可 :
708
+ 使用 ` declare global ` 可以在 npm 包或者 UMD 库中修改全局变量的类型 :
700
709
701
710
``` ts
702
711
// types/foo/index.d.ts
@@ -713,7 +722,7 @@ export default function foo(): string;
713
722
当使用方导入 ` foo ` 之后,就可以使用字符串上的 ` prependHello ` 方法了:
714
723
715
724
``` ts
716
- // index.ts
725
+ // src/ index.ts
717
726
718
727
import foo from ' foo' ;
719
728
' bar' .prependHello ();
0 commit comments