Skip to content

类型别名、接口等

类型别名(type)

类型别名:也就是type,用来给一个类型起个新名字

ts
type myType = string | number
type str = string
type obj = { a: string } & { b: number }

let a: myType = 'aa'
let b: myType = 1
let c: str = 'cc'
let d: obj = { a: 'str', b: 132 }

接口(interface)

接口:在面向对象语言中表示行为抽象,也可以用来描述对象的形状。

使用interface关键字来定义接口

对象的形状

接口可以用来描述对象,主要可以包括以下数据:可读属性、只读属性、任意属性

  • 可读属性:当我们定义一个接口时,我们的属性可能不需要全都要,这是就需要 ? 来解决
  • 只读属性:用 readonly修饰的属性为只读属性,意思是指允许定义,不允许之后进行更改
  • 任意属性:这个属性极为重要,它是可以用作就算没有定义,也可以使用,比如 [data: string]: any。比如说我们对组件进行封装,而封装的那个组件并没有导出对应的类型,然而又想让他不报错,这时就可以使用任意属性
ts
interface Info {
  id: symbol
  username: string
  readonly age: number // 只读属性
  hobby: string[]
  sex?: number // 可选属性
  [a: string]: any // 任意类型数据
}

let user: Info = {
  id: Symbol('123'),
  username: 'ZS',
  age: 20,
  hobby: [],
  xx: 'xx'
}

user.age = 18 // error

继承

继承:与类一样,接口也存在继承属性,也是使用extends字段

ts
interface Info {
  id: symbol
  username: string
  readonly age: number // 只读属性
  hobby: string[]
  sex?: number // 可选属性
  [a: string]: any // 任意类型数据
}


interface User extends Info {
  address: string
}

let user: User = {
  id: Symbol('123'),
  username: 'ZS',
  age: 20,
  hobby: [],
  xx: 'xx',
  address: '郑州'
}

user.age = 18 // error

函数类型接口

同时,可以定义函数和类,加new修饰的是类,不加new的是函数

ts
interface fun {
  (data: number): number // 定义函数类型
}
let user: fun = (data: number): number => data

class A {
  username: string = '123'
  constructor(name: string) {
    this.username = name
  }
}

interface cla {
  new (data: string): any // 定义类 类型
}
// 接收类对象类型的数据
let user1 = (func: cla) => new func('123')

console.log(user1(A))

type 和 interface 的区别

通过上面的学习,我们发现类型别名和接口非常相似,可以说在大多数情况下,type与interface是等价的

但在一些特定的场景差距还是比较大的,接下来逐个来看看

基础数据类型

  • type和interface都可以定义 对象 和 函数
  • type可以定义其他数据类型,如字符串、数字、元祖、联合类型等,而interface不行

扩展

interface 可以扩展 type,type 也可以扩展为 interface,但两者实现扩展的方式不同。

  • interface 是通过 extends 来实现
  • type 是通过 & 来实现

重复定义

interface 可以多次被定义,并且会进行合并,但type不行

Released under the MIT License.