关于前端:TS中type和interface的区别

50次阅读

共计 1727 个字符,预计需要花费 5 分钟才能阅读完成。

异同点

// 代码 1
interface Person<T> {
  age: T;
  sex: string;
}
let lucy: Person<number> = {
  age: 1,
  sex: 'woman',
}
type People<T> = {
  age: T;
  sex: string;
}
let lily: People<number> = {
  age: 1,
  sex: 'woman',
}

从代码 1 中咱们发现接口 interface 和类型别名 type 在定义一个一般的对象类型时没啥区别,泛型都能照常用。

如果咱们定义一个简略类型呢?

// 代码 2
type Name = string | number;
let me: Name = 123;

如代码 2 所示,像这样的简略类型的定义,type 用起来就很随便,然而 interface 恐怕就无奈做到了。

// 代码 3
interface SetPerson {(age: number, sex: string): void;
}

type SetPeople = (age: number, sex: string) => void;

let setPerson: SetPerson = function (age, sex) {};
let setPeople: SetPeople = function (age, sex) {};

如代码 3,它们两都能够轻松实现一个函数的类型,写法略微有点区别,然而它们都能被类 class 实现吗?

// 代码 4
interface SetPerson {(age: number, sex: string): void;
}

type SetPeople = (age: number, sex: string) => void;

class Config implements SetPerson {setPerson(age: number, sex: string) {// do nothing}
}

如代码 4 所示,接口 interface 能够被一个类 class 实现(implements),然而类型别名是不行的。

// 代码 5
interface Common {name: string;}
interface Person<T> extends Common {
  age: T;
  sex: string;
}

let lucy: Person<number> = {
  age: 1,
  sex: 'woman',
  name: 'lucy',
}
// ---- 宰割 ----
type Con = {name: string;}
type People<T> = {
  age: T;
  sex: string;
} & Con;

let lily: People<number> = {
  age: 1,
  sex: 'woman',
  name: 'lily',
}

代码 5 类型别名 type 岂但不能被 extends 和 implements,就连本人也不能 extends 和 implements 其它类型,好在咱们能够用穿插类型代替 extends 来达到同样的成果。

说到这里,你就会发现 type 能够应用联结类型、穿插类型还有元组等类型,如下图。

// 代码 6
interface Common {name: string;}
interface Person<T> extends Common {
  age: T;
  sex: string;
}
type People<T> = {
  age: T;
  sex: string;
} & Common;

type P1 = Person<number> | People<number>;
type P2 = [Person<number>, People<number>];

集体认为类型别名 type 最大的特点是能够联合 typeof 应用,如下:

// 代码 7
class Config {setPerson(age: number, sex: string) {// do nothing}
}

type T = typeof Config;

let C: T = class {setPerson(age: number, sex: string) {// do nothing}
}

图 7

总结
这篇文章次要总结了 typescript 中类型别名 type 和接口 interface 在应用上的一些区别,在类 class 的类型定义中咱们应用接口 interface 来做,在定义简略类型、联结类型、穿插类型、元组时咱们用类型别名 type 来做,并且它和 typeof 可能人造的联合在一起应用。在单方都能实现的区域,它们的区别不大。

正文完
 0