Appearance
类型别名
类型别名用来给一个类型起个新名字。
简单的例子
typescript
type Name = string;
type NameResolver = () => string;
type NameOrResolver = Name | NameResolver;
function getName(n: NameOrResolver): Name {
if (typeof n === 'string') {
return n;
} else {
return n();
}
}
1
2
3
4
5
6
7
8
9
10
2
3
4
5
6
7
8
9
10
上例中,我们使用 type 创建类型别名。
类型别名常用于联合类型。
type 和 interface 的相同点
接口定义
javascript
interface example {
name: string
age: number
}
interface exampleFunc {
(name:string,age:number): void
}
type example = {
name: string
age: number
}
type example = (name:string,age:number) => void
1
2
3
4
5
6
7
8
9
10
11
12
13
14
2
3
4
5
6
7
8
9
10
11
12
13
14
继承
javascript
type exampleType1 = {
name: string
}
interface exampleInterface1 {
name: string
}
type exampleType2 = exampleType1 & {
age: number
}
type exampleType2 = exampleInterface1 & {
age: number
}
interface exampleInterface2 extends exampleType1 {
age: number
}
interface exampleInterface2 extends exampleInterface1 {
age: number
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
可以看到对于 interface 来说,继承是通过 extends 实现的,而 type 的话是通过 & 来实现的,也可以叫做 交叉类型
type 和 interface 的不同点
首先聊聊 type 可以做到,但 interface 不能做到的事情
type 可以定义 基本类型的别名,如 type myString = string
type 可以通过 typeof 操作符来定义,如 type myType = typeof someObj
type 可以申明 联合类型,如 type unionType = myType1 | myType2
type 可以申明 元组类型,如 type yuanzu = [myType1, myType2]
interface 可以做到,但是 type 不可以做到的事情
- interface 可以 声明合并,示例如下
javascript
interface test {
name: string
}
interface test {
age: number
}
/*
test实际为 {
name: string
age: number
}
*/
1
2
3
4
5
6
7
8
9
10
11
12
13
2
3
4
5
6
7
8
9
10
11
12
13
这种情况下,如果是 type 的话,就会报 重复定义 的警告,因此是无法实现 声明合并 的