image.png

interface 和 type 的区别

相同点

都可以描述一个对象或者函数

  1. interface User {
  2. name: string
  3. age: number
  4. }
  5. interface SetUser {
  6. (name: string): void
  7. }
  1. type User = {
  2. name: string
  3. age: number
  4. }
  5. type SetUser = (name: string): void

都允许扩展
而且两者并不是独立的,也就是说 interface 可以 extends type,type也可以extends interface

  1. interface Name {
  2. name: stirng
  3. }
  4. interface User extends Name {
  5. age: number
  6. }
  1. type Name = {
  2. name: string
  3. }
  4. // 使用 &
  5. type User = Name & { age: number }
  1. type Name = {
  2. name: string
  3. }
  4. interface User extends Name {
  5. age: number
  6. }
  1. interface Name {
  2. name: string
  3. }
  4. // 使用 &
  5. type User = Name & { age: number }

不同点

type 可以而 interface 不行

  1. type 可以声明基本类型,联合类型,元组等类型 ```typescript type Name = string

interface Dog { wong() } interface Cat { miao() }

type Pet = Dog | Cat

type PetList = [Dog, Pet] // 具体定义数组每个位置的类型

  1. 2. type 语句中还可以使用 typeof 获取实例的类型进行赋值
  2. ```typescript
  3. let div = document.createElement('div')
  4. type B = typeof div
  1. 其他
    1. type StringOrNumber = string | number
    2. type Text = string | { text: string }
    3. type NameLookup = Dictiononary<string, Person>
    4. type Callback<T> = (data: T) => void
    5. type Pair<T> = [T, T]
    6. type Coordinates = Pair<number>
    7. type Tree<T> = T | { left: Tree<T>, right: Tree<T> }

interface 可以而 type 不行

interface 可以声明合并

  1. interface User {
  2. name: string
  3. age: number
  4. }
  5. interface User {
  6. gender: string
  7. }
  8. /*
  9. User 接口为 {
  10. name: string
  11. age: number
  12. sex: string
  13. }
  14. */

总结

使用 type:

  • 定义原始数据类型的别名(string, boolean, null, number, bigint, symbol, undefined)
  • 定义元组类型
  • 定义函数类型
  • 定义联合类型
  • 试图通过组合重载对象类型中的函数
  • 需要利用映射类型

使用 interface:

  • 对象类型
  • 需要声明合并

索引签名

索引签名属性类型必须是“字符串”或“数字”
也就是 [x: number]或者 [x: string]