@@ -71,7 +71,7 @@ f = function (y:number) {
71
71
72
72
上面示例中,函数类型里面的参数名为` x ` ,实际的函数定义里面,参数名为` y ` ,两者并不相同。
73
73
74
- 如果有多个变量被赋值为同一种类型的函数 ,写法二用起来就很麻烦。因此,往往用` type ` 命令为函数类型定义一个别名,便于指定给其他变量。
74
+ 如果函数的类型定义很冗长,或者多个函数使用同一种类型 ,写法二用起来就很麻烦。因此,往往用` type ` 命令为函数类型定义一个别名,便于指定给其他变量。
75
75
76
76
``` typescript
77
77
type MyFunc = (txt : string ) => void ;
@@ -83,7 +83,7 @@ const hello:MyFunc = function (txt) {
83
83
84
84
上面示例中,` type ` 命令为函数类型定义了一个别名` MyFunc ` ,后面使用就很方便,变量可以指定为这个类型。
85
85
86
- 变量所赋值的函数的参数个数,可以少于指定类型,但是不能多于指定类型,即这种情况下, TypeScript 允许省略参数。
86
+ 函数的实际参数个数,可以少于类型指定的参数个数,但是不能多于,即 TypeScript 允许省略参数。
87
87
88
88
``` typescript
89
89
let myFunc:
@@ -96,9 +96,9 @@ myFunc = (
96
96
) => a + b + c ; // 报错
97
97
```
98
98
99
- 上面示例中,变量` myFunc ` 的类型只能接受两个参数,如果被赋值只有一个参数的函数 ,并不报错。但是,被赋值为有三个参数的函数,就会报错。
99
+ 上面示例中,变量` myFunc ` 的类型只能接受两个参数,如果被赋值为只有一个参数的函数 ,并不报错。但是,被赋值为有三个参数的函数,就会报错。
100
100
101
- 这是因为 JavaScript 函数在声明时往往有多余的参数,实际使用时可以只传入一部分参数。比如,数组的` forEach() ` 方法的参数是一个函数,该函数默认有三个参数` (item, index, array) => void ` ,实际上往往只使用第一个参数` (item) => any ` 。因此,TypeScript 允许参数较少的函数,兼容于参数较多的函数 。
101
+ 这是因为 JavaScript 函数在声明时往往有多余的参数,实际使用时可以只传入一部分参数。比如,数组的` forEach() ` 方法的参数是一个函数,该函数默认有三个参数` (item, index, array) => void ` ,实际上往往只使用第一个参数` (item) => void ` 。因此,TypeScript 允许函数传入的参数不足 。
102
102
103
103
``` typescript
104
104
let x = (a : number ) => 0 ;
@@ -110,7 +110,7 @@ x = y; // 报错
110
110
111
111
上面示例中,函数` x ` 只有一个参数,函数` y ` 有两个参数,` x ` 可以赋值给` y ` ,反过来就不行。
112
112
113
- 如果一个变量要套用另一个函数的类型 ,有一个小技巧,就是使用` typeof ` 运算符。
113
+ 如果一个变量要套用另一个函数类型 ,有一个小技巧,就是使用` typeof ` 运算符。
114
114
115
115
``` typescript
116
116
function add(
@@ -159,7 +159,7 @@ add = function (x, y) {
159
159
function f(x : number ) {
160
160
console .log (x );
161
161
}
162
-
162
+
163
163
f .version = ' 1.0' ;
164
164
```
165
165
@@ -221,7 +221,7 @@ function greet(
221
221
): void {
222
222
fn (' world' );
223
223
}
224
- ```
224
+ ```
225
225
226
226
上面示例中,函数` greet() ` 的参数` fn ` 是一个函数,类型就用箭头函数表示。这时,` fn ` 的返回值类型要写在箭头右侧,而不是写在参数列表的圆括号后面。
227
227
@@ -266,13 +266,13 @@ f(); // OK
266
266
f (10 ); // OK
267
267
```
268
268
269
- 上面示例中,虽然参数` x ` 后面有问号,表示该参数可以省略,不一定需要给出 。
269
+ 上面示例中,虽然参数` x ` 后面有问号,表示该参数可以省略。
270
270
271
271
参数名带有问号,表示该参数的类型实际上是` 原始类型|undefined ` ,它有可能为` undefined ` 。比如,上例的` x ` 虽然类型声明为` number ` ,但是实际上是` number|undefined ` 。
272
272
273
273
``` typescript
274
- function f(x ? : number ) {
275
- return x ;
274
+ function f(x ? : number ) {
275
+ return x ;
276
276
}
277
277
278
278
f (undefined ) // 正确
@@ -301,7 +301,7 @@ let myFunc:
301
301
302
302
上面示例中,可选参数在必选参数前面,就报错了。
303
303
304
- 如果前部参数有可能为空,这时只能显示注明该参数类型可能为 ` undefined ` 。
304
+ 如果前部参数有可能为空,这时只能显式注明该参数类型可能为 ` undefined ` 。
305
305
306
306
``` typescript
307
307
let myFunc:
@@ -361,7 +361,7 @@ function createPoint(
361
361
``` typescript
362
362
// 报错
363
363
function f(x ? : number = 0 ) {
364
- // ...
364
+ // ...
365
365
}
366
366
```
367
367
@@ -401,7 +401,7 @@ function f(
401
401
) {
402
402
// ...
403
403
}
404
-
404
+
405
405
function sum(
406
406
{ a , b , c }: {
407
407
a: number ;
@@ -532,10 +532,10 @@ function f():void {
532
532
}
533
533
```
534
534
535
- 如果打开了` -- strictNullChecks` 编译选项,那么 void 类型只允许返回` undefined ` 。如果返回` null ` ,就会报错。这是因为 JavaScript 规定,如果函数没有返回值,就等同于返回` undefined ` 。
535
+ 如果打开了` strictNullChecks ` 编译选项,那么 void 类型只允许返回` undefined ` 。如果返回` null ` ,就会报错。这是因为 JavaScript 规定,如果函数没有返回值,就等同于返回` undefined ` 。
536
536
537
537
``` typescript
538
- // -- strictNullChecks=true
538
+ // 打开编译选项 strictNullChecks
539
539
540
540
function f(): void {
541
541
return undefined ; // 正确
@@ -550,7 +550,7 @@ function f():void {
550
550
551
551
``` typescript
552
552
type voidFunc = () => void ;
553
-
553
+
554
554
const f: voidFunc = () => {
555
555
return 123 ;
556
556
};
@@ -606,7 +606,7 @@ const f3 = function ():void {
606
606
``` typescript
607
607
let foo: void = undefined ;
608
608
609
- // 没有打开 -- strictNullChecks 的情况下
609
+ // 没有打开 strictNullChecks 的情况下
610
610
let bar: void = null ;
611
611
```
612
612
@@ -763,10 +763,7 @@ function add(
763
763
): number | any [] {
764
764
if (typeof x === ' number' && typeof y === ' number' ) {
765
765
return x + y ;
766
- } else
767
-
768
-
769
- if (Array .isArray (x ) && Array .isArray (y )) {
766
+ } else if (Array .isArray (x ) && Array .isArray (y )) {
770
767
return [... x , ... y ];
771
768
}
772
769
@@ -801,7 +798,7 @@ function f(x:string): 0|1;
801
798
function f(x : any ): any {
802
799
// ...
803
800
}
804
-
801
+
805
802
const a: 0 | 1 = f (' hi' ); // 报错
806
803
` ` `
807
804
@@ -827,7 +824,7 @@ class StringBuilder {
827
824
}
828
825
` ` `
829
826
830
- 上面示例中,方法 ` add ()` 也使用了函数重载。
827
+ 上面示例中,方法 ` add ()` 也使用了函数重载。
831
828
832
829
函数重载也可以用来精确描述函数参数与返回值之间的对应关系。
833
830
@@ -891,7 +888,25 @@ const d = new Date();
891
888
892
889
上面示例中, ` date ()` 就是一个构造函数,使用 ` new ` 命令调用,返回 Date 对象的实例。
893
890
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
+ 构造函数还有另一种类型写法,就是采用对象形式。
895
910
896
911
` ` ` typescript
897
912
type F = {
@@ -912,20 +927,3 @@ type F = {
912
927
913
928
上面示例中,F 既可以当作普通函数执行,也可以当作构造函数使用。
914
929
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》一章。
0 commit comments