Skip to content
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.

Commit 5edc67b

Browse files
committedJul 17, 2023
docs: finish chapter function
1 parent df8d21f commit 5edc67b

File tree

3 files changed

+45
-45
lines changed

3 files changed

+45
-45
lines changed
 

‎chapters.yml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,3 +4,4 @@
44
- types.md: 类型系统
55
- array.md: 数组
66
- tuple.md: 元组
7+
- symbol.md: symbol 类型

‎docs/function.md

Lines changed: 39 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -71,7 +71,7 @@ f = function (y:number) {
7171

7272
上面示例中,函数类型里面的参数名为`x`,实际的函数定义里面,参数名为`y`,两者并不相同。
7373

74-
如果有多个变量被赋值为同一种类型的函数,写法二用起来就很麻烦。因此,往往用`type`命令为函数类型定义一个别名,便于指定给其他变量。
74+
如果函数的类型定义很冗长,或者多个函数使用同一种类型,写法二用起来就很麻烦。因此,往往用`type`命令为函数类型定义一个别名,便于指定给其他变量。
7575

7676
```typescript
7777
type MyFunc = (txt:string) => void;
@@ -83,7 +83,7 @@ const hello:MyFunc = function (txt) {
8383

8484
上面示例中,`type`命令为函数类型定义了一个别名`MyFunc`,后面使用就很方便,变量可以指定为这个类型。
8585

86-
变量所赋值的函数的参数个数,可以少于指定类型,但是不能多于指定类型,即这种情况下,TypeScript 允许省略参数。
86+
函数的实际参数个数,可以少于类型指定的参数个数,但是不能多于,即 TypeScript 允许省略参数。
8787

8888
```typescript
8989
let myFunc:
@@ -96,9 +96,9 @@ myFunc = (
9696
) => a + b + c; // 报错
9797
```
9898

99-
上面示例中,变量`myFunc`的类型只能接受两个参数,如果被赋值只有一个参数的函数,并不报错。但是,被赋值为有三个参数的函数,就会报错。
99+
上面示例中,变量`myFunc`的类型只能接受两个参数,如果被赋值为只有一个参数的函数,并不报错。但是,被赋值为有三个参数的函数,就会报错。
100100

101-
这是因为 JavaScript 函数在声明时往往有多余的参数,实际使用时可以只传入一部分参数。比如,数组的`forEach()`方法的参数是一个函数,该函数默认有三个参数`(item, index, array) => void`,实际上往往只使用第一个参数`(item) => any`。因此,TypeScript 允许参数较少的函数,兼容于参数较多的函数
101+
这是因为 JavaScript 函数在声明时往往有多余的参数,实际使用时可以只传入一部分参数。比如,数组的`forEach()`方法的参数是一个函数,该函数默认有三个参数`(item, index, array) => void`,实际上往往只使用第一个参数`(item) => void`。因此,TypeScript 允许函数传入的参数不足
102102

103103
```typescript
104104
let x = (a:number) => 0;
@@ -110,7 +110,7 @@ x = y; // 报错
110110

111111
上面示例中,函数`x`只有一个参数,函数`y`有两个参数,`x`可以赋值给`y`,反过来就不行。
112112

113-
如果一个变量要套用另一个函数的类型,有一个小技巧,就是使用`typeof`运算符。
113+
如果一个变量要套用另一个函数类型,有一个小技巧,就是使用`typeof`运算符。
114114

115115
```typescript
116116
function add(
@@ -159,7 +159,7 @@ add = function (x, y) {
159159
function f(x:number) {
160160
console.log(x);
161161
}
162-
162+
163163
f.version = '1.0';
164164
```
165165

@@ -221,7 +221,7 @@ function greet(
221221
):void {
222222
fn('world');
223223
}
224-
```
224+
```
225225

226226
上面示例中,函数`greet()`的参数`fn`是一个函数,类型就用箭头函数表示。这时,`fn`的返回值类型要写在箭头右侧,而不是写在参数列表的圆括号后面。
227227

@@ -266,13 +266,13 @@ f(); // OK
266266
f(10); // OK
267267
```
268268

269-
上面示例中,虽然参数`x`后面有问号,表示该参数可以省略,不一定需要给出
269+
上面示例中,虽然参数`x`后面有问号,表示该参数可以省略。
270270

271271
参数名带有问号,表示该参数的类型实际上是`原始类型|undefined`,它有可能为`undefined`。比如,上例的`x`虽然类型声明为`number`,但是实际上是`number|undefined`
272272

273273
```typescript
274-
function f(x?:number) {
275-
return x;
274+
function f(x?:number) {
275+
return x;
276276
}
277277

278278
f(undefined) // 正确
@@ -301,7 +301,7 @@ let myFunc:
301301

302302
上面示例中,可选参数在必选参数前面,就报错了。
303303

304-
如果前部参数有可能为空,这时只能显示注明该参数类型可能为`undefined`
304+
如果前部参数有可能为空,这时只能显式注明该参数类型可能为`undefined`
305305

306306
```typescript
307307
let myFunc:
@@ -361,7 +361,7 @@ function createPoint(
361361
```typescript
362362
// 报错
363363
function f(x?: number = 0) {
364-
// ...
364+
// ...
365365
}
366366
```
367367

@@ -401,7 +401,7 @@ function f(
401401
) {
402402
// ...
403403
}
404-
404+
405405
function sum(
406406
{ a, b, c }: {
407407
a: number;
@@ -532,10 +532,10 @@ function f():void {
532532
}
533533
```
534534

535-
如果打开了`--strictNullChecks`编译选项,那么 void 类型只允许返回`undefined`。如果返回`null`,就会报错。这是因为 JavaScript 规定,如果函数没有返回值,就等同于返回`undefined`
535+
如果打开了`strictNullChecks`编译选项,那么 void 类型只允许返回`undefined`。如果返回`null`,就会报错。这是因为 JavaScript 规定,如果函数没有返回值,就等同于返回`undefined`
536536

537537
```typescript
538-
// --strictNullChecks=true
538+
// 打开编译选项 strictNullChecks
539539

540540
function f():void {
541541
return undefined; // 正确
@@ -550,7 +550,7 @@ function f():void {
550550

551551
```typescript
552552
type voidFunc = () => void;
553-
553+
554554
const f:voidFunc = () => {
555555
return 123;
556556
};
@@ -606,7 +606,7 @@ const f3 = function ():void {
606606
```typescript
607607
let foo:void = undefined;
608608

609-
// 没有打开 --strictNullChecks 的情况下
609+
// 没有打开 strictNullChecks 的情况下
610610
let bar:void = null;
611611
```
612612

@@ -763,10 +763,7 @@ function add(
763763
):number|any[] {
764764
if (typeof x === 'number' && typeof y === 'number') {
765765
return x + y;
766-
} else
767-
768-
769-
if (Array.isArray(x) && Array.isArray(y)) {
766+
} else if (Array.isArray(x) && Array.isArray(y)) {
770767
return [...x, ...y];
771768
}
772769

@@ -801,7 +798,7 @@ function f(x:string): 0|1;
801798
function f(x:any):any {
802799
// ...
803800
}
804-
801+
805802
const a:0|1 = f('hi'); // 报错
806803
```
807804
@@ -827,7 +824,7 @@ class StringBuilder {
827824
}
828825
```
829826
830-
上面示例中,方法`add()`也使用了函数重载。
827+
上面示例中,方法`add()`也使用了函数重载。
831828
832829
函数重载也可以用来精确描述函数参数与返回值之间的对应关系。
833830
@@ -891,7 +888,25 @@ const d = new Date();
891888
892889
上面示例中,`date()`就是一个构造函数,使用`new`命令调用,返回 Date 对象的实例。
893890
894-
构造函数的类型声明,采用对象形式。
891+
构造函数的类型写法,就是在参数列表前面加上`new`命令。
892+
893+
```typescript
894+
class Animal {
895+
numLegs:number = 4;
896+
}
897+
898+
type AnimalConstructor = new () => Animal;
899+
900+
function create(c:AnimalConstructor):Animal {
901+
return new c();
902+
}
903+
904+
const a = create(Animal);
905+
```
906+
907+
上面示例中,类型`AnimalConstructor`就是一个构造函数,而函数`create()`需要传入一个构造函数。在 JavaScript 中,类(class)本质上是构造函数,所以`Animal`这个类可以传入`create()`
908+
909+
构造函数还有另一种类型写法,就是采用对象形式。
895910
896911
```typescript
897912
type F = {
@@ -912,20 +927,3 @@ type F = {
912927
913928
上面示例中,F 既可以当作普通函数执行,也可以当作构造函数使用。
914929
915-
下面是构造函数的一个例子。
916-
917-
```typescript
918-
class Animal {
919-
numLegs: number = 4;
920-
}
921-
922-
function create(c:new () => Animal):Animal {
923-
return new c();
924-
}
925-
926-
const a = create(Animal);
927-
```
928-
929-
上面示例中,函数`create()`的参数`c`是一个构造函数。在 JavaScript 中,类(class)本质上是构造函数,所以可以传入`create()`
930-
931-
不过,构造函数在 TypeScript 里面实际上只能用类(class)的形式来实现,详见《Class》一章。

‎docs/symbol.md

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ x === y // false
2727

2828
```typescript
2929
// 正确
30-
const x:unique symbol = Symbol();
30+
const x:unique symbol = Symbol();
3131

3232
// 报错
3333
let y:unique symbol = Symbol();
@@ -38,12 +38,12 @@ let y:unique symbol = Symbol();
3838
`const`命令为变量赋值 Symbol 值时,变量类型默认就是`unique symbol`,所以类型可以省略不写。
3939

4040
```typescript
41-
const x:unique symbol = Symbol();
41+
const x:unique symbol = Symbol();
4242
// 等同于
4343
const x = Symbol();
4444
```
4545

46-
每个声明为`unique symbol`类型的变量,它们的值都是不一样的,其实属于两个类型
46+
每个声明为`unique symbol`类型的变量,它们的值都是不一样的,其实属于两个值类型
4747

4848
```typescript
4949
const a:unique symbol = Symbol();
@@ -85,7 +85,7 @@ const b:typeof a = a; // 正确
8585

8686
```typescript
8787
const a:unique symbol = Symbol.for('foo');
88-
const b:unique symbol = Symbol.for('foo');
88+
const b:unique symbol = Symbol.for('foo');
8989
```
9090

9191
上面示例中,变量`a``b`是两个不同的值类型,但是它们的值其实是相等的。
@@ -161,3 +161,4 @@ const x = Symbol();
161161
// 类型为 symbol
162162
let y = x;
163163
```
164+

0 commit comments

Comments
 (0)
Please sign in to comment.