Skip to content
On this page

类型别名

类型别名用来给一个类型起个新名字。

简单的例子

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

上例中,我们使用 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

继承

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

可以看到对于 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

这种情况下,如果是 type 的话,就会报 重复定义 的警告,因此是无法实现 声明合并 的

沪ICP备20006251号-1