对象的类型

TS中,使用关键字interface(接口)定义一个对象

1
2
3
4
5
6
7
8
9
10
11
12
13
14
// 接口名通常需要首字母大写
interface Person {
name: string,
age: number
}

// 属性必须要和接口一一对应
let a: Person = {
name: "yajue"
// 不能缺少属性
age: 24,
// 不能多出属性
// add: "下北泽"
}

接口合并

定义的重名接口会被合并

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
interface Person {
name: string
age: number
}

interface Person {
add: string
}

// 分别定义重名接口,接口会被合并
let a: Person = {
name: "yajue",
age: 24,
// 因为接口合并了,所以需要add属性
add: "下北泽"
}

任意属性

如果只对部分属性有强制要求,其他属性随意添加,可以使用索引签名

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

1
2
3
4
5
6
7
8
9
10
11
12
13
interface Person {
name: string
age: number
// 索引签名,定义其他的任意属性
[propName: string]: any
}

// name和age必须有,可以随意添加更多属性
let a: Person = {
name: "yajue",
age: 24,
add: "下北泽"
}

可选属性

定义可有可无的属性

1
2
3
4
5
6
7
8
9
10
11
interface Person {
name: string
age?: number
}

// name必须有,age可有可无
let a: Person = {
name: "yajue",
// 没有age也可以
// age: 24,
}

只读属性

定义只能被读取、不能被修改的属性,常用于方法(值为函数的属性)和后台返回的id值

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
interface Person {
name: string
age: number
// 加入readonly修饰符代表只读属性
readonly cb: ()=>boolean
}

let a: Person = {
name: "yajue",
age: 24,
cb: ()=> false
}

// 可以调用只读属性
a.cb()
// 但不能修改
// a.cb = ()=>true

接口继承

接口继承,子接口不仅有自己定义的属性,还有着父接口定义的属性

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
interface Person {
name: string
age: number
}

interface Person2 extends Person {
add: string
}

let a: Person = {
name: "yajue",
age: 24
// 没有add
}

let b: Person2 = {
// name和age必须要有
name: "knn",
age: Infinity,
// 而且还得有add
add: "朽木村"
}

定义函数类型

接口也可以直接定义函数的类型

1
2
3
4
5
6
7
8
9
interface Fn {
// 括号内定义函数的参数,冒号后定义函数的返回值
(name: string): number[]
}

const fn:Fn = function(name: string) {
console.log(name)
return [1]
}