# 对象的类型 接口

# 概念

  • 对行为的抽象,对对象的形状进行描述

# 例子

  • 少一个 或 多一个 属性是不允许的
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

# 可选属性

  • 不允许添加未定义的属性
// 可选属性
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

# 任意类型

  • 一旦定义了任意类型,那么确定类型和可选属性的类型都必须是它的类型的子集

  • 一个接口中只能定义一个任意类型,如果接口中有多个类型的属性,则可以在任意类型中使用联合类型

// 任意属性
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

# 只读属性

  • 只读的约束存在于第一次给对象赋值的时候,而不是第一次给只读属性赋值的时候
// 只读属性
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