typescript中接口(interface)和类型别名(type)的区别

3,266 阅读2分钟

1.接口

1.1 基本使用

// 接口用来定义一个类结构,用来定义一个类中应该包含哪些属性和方法
// 接口名可以重复(可以声明合并)
  interface yourType {
    name: string
    age: number
  }
  interface yourType {
    gender: string
  }

  const you: yourType = {
    name: 'yoyo',
    age: 333,
    gender: '女'   // 这里的属性要和接口中一致,不能少,不能多
  }
  • interface 只能表示像对象那种结构的类型

1.2 行为的抽象

实现(implements)是面向对象中的一个重要概念。
一般来讲,一个类只能继承自另一个类,有时候不同类之间可以有一些共有的特性,这时候就可以把特性提取成接口(interface),用 implements 关键字来实现。这个特性大大提高了面向对象的灵活性。

  • 接口就是把一些类中共有的属性和方法抽象出来,可以用来约束实现此接口的类
  • 一个类可以实现多个接口,一个接口也可以被多个类实现,但一个类的可以有多个子类,但只能有一个父类
// 一个类可以实现多个接口
interface Test {
  name: string
}

interface Test1 {
  age: number
}

class TestData implements Test, Test1 {
  name: string
  age: number
  constructor(name: string, age: number) {
    this.name = name,
    this.age =age
  }
}

const useTestData = new TestData('zs', 12)

2.类型

2.1 基本使用

  // 描述一个对象的类型
  // 类型别名:名称唯一,不能重复
  type myType = {
    name: string
    age: number
  }

  const obj: myType = {
    name: 'ccc',
    age: 33  // 这里的属性要和类型声明中一致,不能少,不能多
  }
  • ts除对象类型,可以声明(undefinednullbooleanstringnumber)类型

3. 两者区别

3.1 命名规范

  • type类型别名 命名唯一,不可重复
  • interface接口 可以重复定义
// 类型声明,名称唯一,不可重复
type typeA = {
    name: string,
    age: number
}
const aa: typeA = {
    // 这里的属性要和类型声明中一致,不能少,不能多
    name: 'zs',
    age: 18
}

interface something  {
    name: string,
    age: number
}
interface something  {
    level: number
}
const objs: something = {
    name: 'zs',
    age: 18,
    level: 3
}

3.2 type可以使用in 关键字生成映射类型 interface不行

type Keys = "firstname" | "surname"

type DudeType = {
  [key in Keys]: string
}

const test: DudeType = {
  firstname: "Pawel",
  surname: "Grzybek"
}

3.2 interface 与 type 可以相互扩展对方 单语法不通 (extends关键字 &操作符)

type PartialPointX = { x: number; };
interface Point extends PartialPointX { y: number; } // 利用type扩展interface
const obj: Point = {
    x: 22,
    y: 33
}

interface PartialPointX { x: number; }
type Point = PartialPointX & { y: number; }; // 利用interface扩展 type
const obj: Point = {
    x: 22,
    y: 33
}
console.log(obj) 
// 输出:
// { "x": 22, "y": 33 }

建议: 公共的用 interface 实现,不能用 interface 实现的再用 type 实现
用interface描述数据结构,用type描述类型关系

参考: juejin.cn/post/700648…