Iwen's blog Iwen's blog
首页
  • 前端文章

    • JavaScript
    • Vue
  • 学习笔记

    • 《JavaScript教程》笔记
    • 《JavaScript高级程序设计》笔记
    • 《ES6 教程》笔记
    • 《Vue》笔记
    • 《TypeScript 从零实现 axios》
    • 小程序笔记
  • HTML
  • CSS
  • 技术文档
  • GitHub技巧
  • Nodejs
  • 博客搭建
  • Linux
  • 学习
  • 面试
  • 心情杂货
  • 友情链接
  • 网站
  • 资源
  • Vue资源
  • 分类
  • 标签
  • 归档
复盘
关于

Iwen

不摸鱼的哥哥
首页
  • 前端文章

    • JavaScript
    • Vue
  • 学习笔记

    • 《JavaScript教程》笔记
    • 《JavaScript高级程序设计》笔记
    • 《ES6 教程》笔记
    • 《Vue》笔记
    • 《TypeScript 从零实现 axios》
    • 小程序笔记
  • HTML
  • CSS
  • 技术文档
  • GitHub技巧
  • Nodejs
  • 博客搭建
  • Linux
  • 学习
  • 面试
  • 心情杂货
  • 友情链接
  • 网站
  • 资源
  • Vue资源
  • 分类
  • 标签
  • 归档
复盘
关于
  • Vue

  • Vue进阶

  • CSS

  • ES6

  • Base

  • Core

  • Array

  • Object

  • String

  • Async

  • Browser

  • Http

  • 性能优化

  • 正则

  • 经典总结

  • 设计模式

  • 数据结构

  • 算法

  • 手写

  • TypeScript

    • ts中interface VS type
      • 相同点
        • 都可以描述一个对象或者函数
        • 都允许拓展(extends)
      • 不同点
        • type 可以而 interface 不行
        • interface 可以而 type 不行
    • ts有而Es6沒有的
  • 复盘
  • TypeScript
Mr.w
2020-12-09

ts中interface VS type

# interface VS type

大家使用 typescript 总会使用到 interface 和 type,官方规范 (opens new window) 稍微说了下两者的区别

  • An interface can be named in an extends or implements clause, but a type alias for an object type literal cannot.
  • An interface can have multiple merged declarations, but a type alias for an object type literal cannot.

但是没有太具体的例子。

明人不说暗话,直接上区别。

# 相同点

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

# interface

interface User {
  name: string
  age: number
}

interface SetUser {
  (name: string, age: number): void;
}
1
2
3
4
5
6
7
8

# type

type User = {
  name: string
  age: number
};

type SetUser = (name: string, age: number)=> void;
1
2
3
4
5
6

# 都允许拓展(extends)

interface 和 type 都可以拓展,并且两者并不是相互独立的,也就是说 interface 可以 extends type, type 也可以 extends interface 。 虽然效果差不多,但是两者语法不同。

# interface extends interface

interface Name { 
  name: string; 
}
interface User extends Name { 
  age: number; 
}
1
2
3
4
5
6

# type extends type

type Name = { 
  name: string; 
}
type User = Name & { age: number  };
1
2
3
4

# interface extends type

type Name = { 
  name: string; 
}
interface User extends Name { 
  age: number; 
}
1
2
3
4
5
6

# type extends interface

interface Name { 
  name: string; 
}
type User = Name & { 
  age: number; 
}
1
2
3
4
5
6

# 不同点

# type 可以而 interface 不行

  • type 可以声明基本类型别名,联合类型,元组等类型
type Name = string

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

type Pet = Dog | Cat

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
  • type 语句中还可以使用 typeof 获取实例的 类型进行赋值
// 当你想获取一个变量的类型时,使用 typeof
let div = document.createElement('div');
type B = typeof div
1
2
3
  • 其他骚操作
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> };
1
2
3
4
5
6
7

# interface 可以而 type 不行

interface 能够声明合并

interface User {
  name: string
  age: number
}

interface User {
  sex: string
}

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

# 总结

一般来说,如果不清楚什么时候用interface/type,能用 interface 实现,就用 interface , 如果不能就用 type 。其他更多详情参看 官方规范文档 (opens new window)

JSON 字符串
ts有而Es6沒有的

← JSON 字符串 ts有而Es6沒有的→

最近更新
01
flex布局页面自适应滚动条问题
12-28
02
前后端分离开发请求接口跨域如何携带cookie的问题
12-28
03
怎么实现div长宽比固定width-height4比3
12-28
更多文章>
Theme by Vdoing | Copyright © 2017-2022 Iwen | MIT License
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式