【Typescript 系列】第八节:interface与type区别

197 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第8天,点击查看活动详情

1. 引言

今天,我们来介绍下载TypeScript类型定义系统中常见的两种定义类型的方式,分别是interface(接口)和type(类型别名)

2. 含义

相同点: 都可以描述一个对象或者函数,type 描述时需要赋值操作,interface则不需要(请看例子一),都允许拓展:但是方式不同interface使用extends 而type使用交叉类型,并且两者并不是互相独立的,也就是说interface可以extends type, type也可以extends interface. 虽然效果差不多,但是语法不同(请看例子二)
不同点: ①type 重复定义相同名称类型会报错,而interface不会报错,还能够声明合并的。(请看例子三)②type可以声明基本类型别名、联合类型、元祖等类型;而interface只定义对象类型(请看例子四)

3. 作用

type声明的方式可以定义组合类型,交叉类型和原始类型 虽然接口可以被扩展和合并,但它们不能以联合和交集的形式组合在一起。类型可以使用联合和交集操作符来形成新的类型。

4. 例子

例子一:
interface User {
    age: number,
    name: string
}
interface SetUser {
  (name: string,age: number): void
}

type User2 = {
    age: number,
    name: string
}
type SetUser2 = {
  (name: string,age: number): void
}

例子二:
// interface 的方式
interface  UserName {
    name: string;
}

interface UserInfo extends UserName {
    age: number;
}
// type 的方式
type UserName = {
    name: string;
}

type UserInfo = UserName & { age: number }
// 两种混合模式
①interface extends type
type Name = {
    name: string;
}

interface User extends Name {
    age: number;
}

②type extends interface
interface Name {
    name: string;
}

type User = Name & {
    age: number;
}
例子三:
interface User {
    name: string
    age: number
}

interface User {
    sex: string
}
// 最后 User类型为{name: string,age: number,sex: string}
例子四:

type Name = string;

// 联合类型
interface Dog {
    wong()
}
interface Cat {
    miao();
}

type Pet = Dog | Cat;

type PetList = [Dog, Pet];

例子五:

type StringOrNumber = string | number; 
type Text = string | { text: string }; 
type NameLookup = Dictionary<string, Person>; 
type Callback<T> = (data: T) => void; 
type Pair<T> = [T, T]; 
type Coordinates = Pair<number>; 
type Tree<T> = T | { left: Tree<T>, right: Tree<T> };

5. 总结

一般来说定义接口返回值,数据提交值等场景对象类型场景时候用interface;定义基本类型别名、联合类型、元祖等类型,自定义对象方法时候使用type;