Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit 25993f2

Browse files
committed
typo
1 parent 3f26e80 commit 25993f2

File tree

1 file changed

+23
-14
lines changed

1 file changed

+23
-14
lines changed

basics/declaration-files.md

Lines changed: 23 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@ jQuery('#foo');
4242
通常我们会把声明语句放到一个单独的文件(`jQuery.d.ts`)中,这就是声明文件:
4343

4444
```ts
45-
// jQuery.d.ts
45+
// src/jQuery.d.ts
4646

4747
declare var jQuery: (selector: string) => any;
4848
```
@@ -51,6 +51,15 @@ declare var jQuery: (selector: string) => any;
5151

5252
一般来说,ts 会解析项目中所有的 `*.ts` 文件,当然也包含以 `.d.ts` 结尾的文件。所以当我们将 `jQuery.d.ts` 放到项目中时,其他所有 `*.ts` 文件就都可以获得 `jQuery` 的类型定义了。
5353

54+
```
55+
/path/to/project
56+
├── README.md
57+
├── src
58+
| ├── index.ts
59+
| └── jQuery.d.ts
60+
└── tsconfig.json
61+
```
62+
5463
假如仍然无法解析,那么可以检查下 `tsconfig.json` 中的 `files``include``exclude` 配置,确保其包含了 `jQuery.d.ts` 文件。
5564

5665
这里只演示了全局变量这种模式的声明文件,假如是通过模块导入的方式使用第三方库的话,那么引入声明文件又是另一种方式了,将会在后面详细介绍。
@@ -81,7 +90,7 @@ npm install @types/jquery --save-dev
8190
- npm 包:通过 `import foo from 'foo'` 导入,符合 ES6 模块规范
8291
- UMD 库:既可以通过 `<script>` 标签引入,又可以通过 `import` 导入
8392
- 模块插件:通过 `import` 导入后,可以改变另一个模块的结构
84-
- 直接修改全局变量:通过 `<script>` 标签引入后,改变一个全局变量的结构。比如为 `Array.prototype` 新增了一个方法
93+
- 直接修改全局变量:通过 `<script>` 标签引入后,改变一个全局变量的结构。比如为 `String.prototype` 新增了一个方法
8594
- 通过导入修改全局变量:通过 `import` 导入后,可以改变一个全局变量的结构
8695

8796
### 全局变量
@@ -308,7 +317,7 @@ jQuery.fn.extend({
308317
除了全局变量之外,有一些类型我们可能也希望能暴露出来。在类型声明文件中,我们可以直接使用 `interface``type` 来声明一个全局的类型:
309318

310319
```ts
311-
// jQuery.d.ts
320+
// src/jQuery.d.ts
312321

313322
interface AjaxSettings {
314323
method?: 'GET' | 'POST'
@@ -322,7 +331,7 @@ declare namespace jQuery {
322331
这样的话,在其他文件中也可以使用这个接口了:
323332

324333
```ts
325-
// index.ts
334+
// src/index.ts
326335

327336
let settings: AjaxSettings = {
328337
method: 'POST',
@@ -340,7 +349,7 @@ jQuery.ajax('/api/post_something', settings);
340349
暴露在最外层的 `interface``type` 会作为全局类型作用于整个项目中,我们应该尽可能的减少全局变量或全局类型的数量。故应该将他们放到 `namespace` 下:
341350

342351
```ts
343-
// jQuery.d.ts
352+
// src/jQuery.d.ts
344353

345354
declare namespace jQuery {
346355
interface AjaxSettings {
@@ -354,7 +363,7 @@ declare namespace jQuery {
354363
注意,在使用这个 `interface` 的时候,也应该加上 `jQuery` 前缀了:
355364

356365
```ts
357-
// index.ts
366+
// src/index.ts
358367

359368
let settings: jQuery.AjaxSettings = {
360369
method: 'POST',
@@ -367,7 +376,7 @@ jQuery.ajax('/api/post_something', settings);
367376

368377
#### 声明合并
369378

370-
假如 jQuery 既是一个函数,可以直接被调用`jQuery('#foo')`,又是一个对象,拥有子属性`jQuery.ajax()`(事实确实如此),则我们可以组合多个声明语句,它们会不冲突的合并起来:
379+
假如 jQuery 既是一个函数,可以直接被调用 `jQuery('#foo')`,又是一个对象,拥有子属性 `jQuery.ajax()`(事实确实如此),则我们可以组合多个声明语句,它们会不冲突的合并起来:
371380

372381
```ts
373382
declare function jQuery(selector: string): any;
@@ -395,7 +404,7 @@ jQuery.ajax('/api/get_something');
395404
1. 创建一个 `node_modules/@types/foo/index.d.ts` 文件,存放 `foo` 模块的声明文件。这种方式不需要额外的配置,但是 `node_modules` 目录不稳定,代码也没有被保存到仓库中,无法回溯版本,有不小心被删除的风险。
396405
2. 创建一个 `types` 目录,专门用来管理自己写的声明文件,将 `foo` 的声明文件放到 `types/foo/index.d.ts` 中。这种方式需要配置下 `tsconfig.json``paths``baseUrl` 字段。
397406

398-
`types` 目录
407+
目录结构
399408

400409
```
401410
/path/to/project
@@ -522,7 +531,7 @@ export namespace foo {
522531
```
523532

524533
```ts
525-
// index.ts
534+
// src/index.ts
526535

527536
import { foo } from 'foo';
528537

@@ -543,7 +552,7 @@ export default function foo(): string;
543552
```
544553

545554
```ts
546-
// index.ts
555+
// src/index.ts
547556

548557
import foo from 'foo';
549558

@@ -636,7 +645,7 @@ declare namespace foo {
636645

637646
准确地讲,`export = ` 不仅可以用在声明文件中,也可以用在普通的 ts 文件中。实际上,`import ... require``export =` 都是 ts 为了兼容 AMD 规范和 commonjs 规范而创立的新语法,由于并不常用也不推荐使用,所以这里就不详细介绍了,感兴趣的可以看[官方文档](https://www.typescriptlang.org/docs/handbook/modules.html#export--and-import--require)
638647

639-
由于很多第三方库是 commonjs 规范的,所以声明文件也就不得不用到 `export =` 这种语法了。但是还是需要强调下,相比与 `export =`,我们更推荐使用 ES6 标准的 `export default``export`
648+
由于很多第三方库是 commonjs 规范的,所以声明文件也就不得不用到 `export =` 这种语法了。但是还是需要再强调下,相比与 `export =`,我们更推荐使用 ES6 标准的 `export default``export`
640649

641650
### UMD 库
642651

@@ -692,11 +701,11 @@ interface String {
692701

693702
### 通过导入修改全局变量
694703

695-
如之前所说,对于一个 npm 包或者 UMD 库的声明文件,只有 `export` 导出的类型声明才会有效。所以对于 npm 包或 UMD 库,如果导入此库之后会修改全局变量,则需要使用另一种语法在声明文件中修改全局变量的类型,那就是 `declare global`
704+
如之前所说,对于一个 npm 包或者 UMD 库的声明文件,只有 `export` 导出的类型声明才会有效。所以对于 npm 包或 UMD 库,如果导入此库之后会修改全局变量,则需要使用另一种语法在声明文件中修改全局变量的类型,那就是 `declare global`
696705

697706
#### `declare global`
698707

699-
我们将直接修改全局变量的部分,使用 `declare global` 包起来即可
708+
使用 `declare global` 可以在 npm 包或者 UMD 库中修改全局变量的类型
700709

701710
```ts
702711
// types/foo/index.d.ts
@@ -713,7 +722,7 @@ export default function foo(): string;
713722
当使用方导入 `foo` 之后,就可以使用字符串上的 `prependHello` 方法了:
714723

715724
```ts
716-
// index.ts
725+
// src/index.ts
717726

718727
import foo from 'foo';
719728
'bar'.prependHello();

0 commit comments

Comments
 (0)