7
7
对象类型的最简单声明方法,就是使用大括号表示对象,在大括号内部声明每个属性和方法的类型。
8
8
9
9
``` typescript
10
- const obj: {
10
+ const obj: {
11
11
x: number ;
12
- y: number ;
12
+ y: number ;
13
13
} = { x: 1 , y: 1 };
14
14
```
15
15
@@ -36,9 +36,9 @@ type MyObj = {
36
36
一旦声明了类型,对象赋值时,就不能缺少指定的属性,也不能有多余的属性。
37
37
38
38
``` typescript
39
- type MyObj = {
39
+ type MyObj = {
40
40
x: number ;
41
- y: number ;
41
+ y: number ;
42
42
};
43
43
44
44
const o1: MyObj = { x: 1 }; // 报错
@@ -50,9 +50,9 @@ const o2:MyObj = { x: 1, y: 1, z: 1 }; // 报错
50
50
读写不存在的属性也会报错。
51
51
52
52
``` typescript
53
- const obj: {
53
+ const obj: {
54
54
x: number ;
55
- y: number ;
55
+ y: number ;
56
56
} = { x: 1 , y: 1 };
57
57
58
58
console .log (obj .z ); // 报错
@@ -83,13 +83,13 @@ const obj:{
83
83
add(x : number , y : number ): number ;
84
84
// 或者写成
85
85
// add: (x:number, y:number) => number;
86
- } = {
87
- x: 1 ,
88
- y: 1 ,
86
+ } = {
87
+ x: 1 ,
88
+ y: 1 ,
89
89
add(x , y ) {
90
90
return x + y ;
91
- }
92
- };
91
+ }
92
+ };
93
93
```
94
94
95
95
上面示例中,对象` obj ` 有一个方法` add() ` ,需要定义它的参数类型和返回值类型。
@@ -110,9 +110,9 @@ type Name = User['name']; // string
110
110
111
111
``` typescript
112
112
// 写法一
113
- type MyObj = {
113
+ type MyObj = {
114
114
x: number ;
115
- y: number ;
115
+ y: number ;
116
116
};
117
117
118
118
const obj: MyObj = { x: 1 , y: 1 };
@@ -123,7 +123,7 @@ interface MyObj {
123
123
y: number ;
124
124
}
125
125
126
- const obj: MyObj = { x: 1 , y: 1 };
126
+ const obj: MyObj = { x: 1 , y: 1 };
127
127
```
128
128
129
129
上面示例中,写法一是` type ` 命令的用法,写法二是` interface ` 命令的用法。` interface ` 命令的详细解释,以及与` type ` 命令的区别,详见《Interface》一章。
@@ -148,9 +148,9 @@ const obj:MyInterface = { // 正确
148
148
如果某个属性是可选的(即可以忽略),需要在属性名后面加一个问号。
149
149
150
150
``` typescript
151
- const obj: {
151
+ const obj: {
152
152
x: number ;
153
- y? : number ;
153
+ y? : number ;
154
154
} = { x: 1 };
155
155
```
156
156
@@ -200,11 +200,11 @@ if (user.lastName !== undefined) {
200
200
}
201
201
```
202
202
203
- 上面示例中,` lastName ` 是可选属性,需要判断是否为` undefined ` 以后,才能使用。建议可以使用下面的写法 。
203
+ 上面示例中,` lastName ` 是可选属性,需要判断是否为` undefined ` 以后,才能使用。建议使用下面的写法 。
204
204
205
205
``` typescript
206
206
// 写法一
207
- let firstName = (user .firstName === undefined )
207
+ let firstName = (user .firstName === undefined )
208
208
? ' Foo' : user .firstName ;
209
209
let lastName = (user .lastName === undefined )
210
210
? ' Bar' : user .lastName ;
@@ -286,7 +286,7 @@ interface Person {
286
286
name: string ;
287
287
age: number ;
288
288
}
289
-
289
+
290
290
interface ReadonlyPerson {
291
291
readonly name: string ;
292
292
readonly age: number ;
@@ -344,12 +344,12 @@ const obj:MyObj = {
344
344
foo: ' a' ,
345
345
bar: ' b' ,
346
346
baz: ' c' ,
347
- };
347
+ };
348
348
```
349
349
350
350
上面示例中,类型` MyObj ` 的属性名类型就采用了表达式形式,写在方括号里面。` [property: string] ` 的` property ` 表示属性名,这个是可以随便起的,它的类型是` string ` ,即属性名类型为` string ` 。也就是说,不管这个对象有多少属性,只要属性名为字符串,且属性值也是字符串,就符合这个类型声明。
351
351
352
- 属性名 (即上例的` property ` )的类型有三种可能,除了上例的` string ` ,还有` number ` 和` symbol ` 。
352
+ JavaScript 对象的属性名 (即上例的` property ` )的类型有三种可能,除了上例的` string ` ,还有` number ` 和` symbol ` 。
353
353
354
354
``` typescript
355
355
type T1 = {
@@ -430,7 +430,7 @@ const {id, name, price} = product;
430
430
const {id, name, price}: {
431
431
id: string ;
432
432
name: string ;
433
- price: number
433
+ price: number
434
434
} = product ;
435
435
```
436
436
@@ -520,7 +520,7 @@ function getSum(obj:myObj) {
520
520
}
521
521
```
522
522
523
- 上面示例中,函数` getSum() ` 要求传入参数的类型是` myObj ` ,但是实际上所有与` myObj ` 兼容的对象都可以传入。这会导致` const v = obj[n] ` 这一行会报错 ,原因是` obj[n] ` 取出的属性值不一定是数值(` number ` ),使得变量` v ` 的类型是 ` any ` 。如果不允许变量类型推断为 ` any ` ,代码就会报错。如果写成下面这样 ,就不会报错。
523
+ 上面示例中,函数` getSum() ` 要求传入参数的类型是` myObj ` ,但是实际上所有与` myObj ` 兼容的对象都可以传入。这会导致` const v = obj[n] ` 这一行报错 ,原因是` obj[n] ` 取出的属性值不一定是数值(` number ` ),使得变量` v ` 的类型被推断为 ` any ` 。如果项目设置为不允许变量类型推断为 ` any ` ,代码就会报错。写成下面这样 ,就不会报错。
524
524
525
525
``` typescript
526
526
type MyObj = {
@@ -569,7 +569,7 @@ const point:{
569
569
570
570
上面示例中,等号右边是一个变量,就不会触发严格字面量检查,从而不报错。
571
571
572
- TypeScript 对字面量进行严格检查的目的,主要是防止拼写错误。一般来说,字面量大多数来自手写,容易出现拼写错误,或者误用了 API。
572
+ TypeScript 对字面量进行严格检查的目的,主要是防止拼写错误。一般来说,字面量大多数来自手写,容易出现拼写错误,或者误用 API。
573
573
574
574
``` typescript
575
575
type Options = {
@@ -603,7 +603,7 @@ const Obj:Options = myOptions;
603
603
``` typescript
604
604
const Obj: Options = {
605
605
title: ' 我的网页' ,
606
- darkmode: true ,
606
+ darkmode: true ,
607
607
} as Options ;
608
608
```
609
609
@@ -638,7 +638,7 @@ computeDistance({x: 1, y: 2}); // 正确
638
638
639
639
上面示例中,对象字面量传入函数` computeDistance() ` 时,不能有多余的属性,否则就通不过严格字面量检查。
640
640
641
- 编译器选项` suppressExcessPropertyErrors ` ,可以在 ` tsconfig.json ` 文件里面关闭多余属性检查 。
641
+ 编译器选项` suppressExcessPropertyErrors ` ,可以关闭多余属性检查。下面是它在 tsconfig.json 文件里面的写法 。
642
642
643
643
``` typescript
644
644
{
@@ -745,9 +745,9 @@ d = 'hello';
745
745
d = 2 ;
746
746
```
747
747
748
- 上面示例中,各类类型的值 (除了` null ` 和` undefined ` )都可以赋值给空对象类型,跟` Object ` 类型的行为是一样的。
748
+ 上面示例中,各种类型的值 (除了` null ` 和` undefined ` )都可以赋值给空对象类型,跟` Object ` 类型的行为是一样的。
749
749
750
- 由于空对象是 ` Object ` 类型的简写,所以它不会有严格字面量检查,赋值时总是允许多余的属性,只是不能读取这些属性。
750
+ 因为 ` Object ` 可以接受各种类型的值,而空对象是 ` Object ` 类型的简写,所以它不会有严格字面量检查,赋值时总是允许多余的属性,只是不能读取这些属性。
751
751
752
752
``` typescript
753
753
interface Empty { }
@@ -769,3 +769,4 @@ const a:WithoutProperties = { prop: 1 };
769
769
```
770
770
771
771
上面的示例中,` [key: string]: never ` 表示字符串属性名是不存在的,因此其他对象进行赋值时就会报错。
772
+
0 commit comments