# 对象的类型 接口
# 概念
- 对行为的抽象,对对象的形状进行描述
# 例子
- 少一个 或 多一个 属性是不允许的
interface Person {
name: string,
age: number
}
// 正常定义对象
const Ben: Person = {
name: 'Ben',
age: 12
}
// 少一个 或 多一个 属性是不允许的
// const Tom: Person = {
// name: 'Tom'
// }
// error TS2741: Property 'age' is missing in type '{ name: string; }' but required in type 'Person'.
// const Jone: Person = {
// name: 'Jone',
// age: 12,
// sex: 'male'
// }
// error TS2322: Type '{ name: string; age: number; sex: string; }' is not assignable to type 'Person'.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
# 可选属性
- 不允许添加未定义的属性
// 可选属性
interface Person2 {
name: string,
height?: string
}
const jim: Person2 = {
name: 'Jim'
}
const yo: Person2 = {
name: 'Yo',
height: '175cm'
}
// 但不允许添加未定义的属性
// const james: Person2 = {
// name: 'James',
// age: 37
// }
// error TS2322: Type '{ name: string; age: number; }' is not assignable to type 'Person2'.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
# 任意类型
一旦定义了任意类型,那么确定类型和可选属性的类型都必须是它的类型的子集
一个接口中只能定义一个任意类型,如果接口中有多个类型的属性,则可以在任意类型中使用联合类型
// 任意属性
interface Person3 {
name: string,
age?: number,
[propsName: string]: any, // 注意这里使用的是 any
}
const kawi: Person3 = {
name: 'kawi',
height: '201cm'
}
// 一旦定义了任意类型,那么确定类型和可选属性的类型都必须是它的类型的子集
// interface Person4 {
// name: string,
// age?: number, // 类型“number”的属性“age”不能赋给“string”索引类型“string”
// [propsName: string]: string,
// }
// 任意类型定义了 string 类型,而可选类型 age 的类型是 number ,会有 ts 告警
// 一个接口中只能定义一个任意类型,如果接口中有多个类型的属性,则可以在任意类型中使用联合类型
interface Person5 {
name: string,
age?: number,
[propsName: string]: string | number,
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
# 只读属性
- 只读的约束存在于第一次给对象赋值的时候,而不是第一次给只读属性赋值的时候
// 只读属性
interface Person6 {
readonly id: string,
name: string,
}
const west: Person6 = {
name: 'West',
id: '0'
}
// west.id = '1' // 无法分配到 "id" ,因为它是只读属性
// 只读的约束存在于第一次给对象赋值的时候,而不是第一次给只读属性赋值的时候
const owen: Person6 = {
name: 'Owen'
}
// 对 owen 赋值时没有给 id 属性赋值
owen.id = '11'
// 不能给 readonly 的属性赋值
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21