interface,class,和abstract class这3个概念,既有联系,又有区别,本文尝试着结合官方文档来阐述这三者之间的关系。

1. Declaration Merging

Declaration Type Namespace Type Value
Namespace X X
Class X X
Enum X X
Interface X
Type Alias X
Function X
Variable X

首先我们来讲一下上面这张表格,当我们第一列的关键字进行声明时,我们在做什么。

namespace job {
haircut(): void;
} class Man{
name: string;
}
let imgss = new Man(); enum Color {red, blue, yellow} interface dogfood { brand: string;
price: number
}
type event = 'mouse' | 'keyboard'; function foo(){} let a = 2;
var b = {};
const c = null;

namespace用来声明一个命名空间,比较著名的命名空间有lodash,里面有一堆工具函数,统统放在一个叫_的namespace里面,同时你也可以let $ = _;所以namespace也声明了一个值。

class声明了一个值,也声明了一种类型,你可以把Man赋值给一个变量,所以class是一种值,也可以说imgss是一个Man(类型),此时Man承担了一种类型的角色。

enum声明了一个值,也声明了一种类型。我们说red是一种Color,Color在这里承担类型的角色,也可以把Color赋值给一个变量

interface声明了一种类型,但是你不能把dogfood赋值给某个变量,否则你会得到一个报错``dogfood' only refers to a type, but is being used as a value here`

其他function,let,var,const都在声明一个值,你 不能说xxx是一个a,或者xxx是一个foo,不能把值当成类型使用。

2. interface和class

我们知道,不算symbol,js中有6种基本类型,number,string,boolean,null, undefined, object。但是只依靠这几种类型,来描述某个函数需要传什么样的参数,是远远不够的,这也是interface的使命--描述一个值(value)的形状(type)。

现在我们来看class,class首先也具有interface的能力,描述一个形状,或者说代表一种类型。此外class还提供了实现,也就是说可以被实例化;

所以class可以implements interface:

interface ManLike {
speak(): void;
leg: number;
hand: number;
}
class Human implements ManLike {
leg: number = 2;
hand: number = 2;
speak() {
console.log('i can speak');
}
}

而interface可以extends class,此时的class承担类型的角色

interface Chinese extends Human {
country: string;
}

那么interface能不能extends enum或者type alias呢,这两个兄弟也声明了type啊,答案是不行的,官方报错的信息:

An interface can only extend an object type or intersection of object types with statically known members.

3. class和abstract class

class和abstract class的区别主要是abstract class不能被实例化:

abstract Human {
name: string;
abstract lang(): void;
toString() {
return `<human:${this.name}>`
}
}
new Human // Cannot create an instance of an abstract class.

4. interface和abstract class

两者都不能被实例化,但是abstract class 也可以被赋值给变量。

interface 里面不能有方法的实现,abstract class 可以提供部分的方法实现,这些方法可以被子类调用。

最新文章

  1. max min 与 min max 的差别
  2. ubuntu 安装配置jdk+eclipse+android sdk
  3. 【CodeVS 1037】取数游戏
  4. [Android] HttpURLConnection &amp; HttpClient &amp; Socket
  5. 移动web开发总结
  6. Channel Allocation
  7. IOS之分析网易新闻存储数据(CoreData的使用,增删改查)
  8. hello world of hibernate Annotation
  9. Spring AOP--返回通知,异常通知和环绕通知
  10. win8 64位 mysql安装 Configuration file my.ini error code -1
  11. .net转php laraval框架学习系列(四) 项目实战---View
  12. linux下安装配置svn独立服务器
  13. Socket编程模式
  14. install OwnCloud9 on CentOS7
  15. 关于python深浅拷贝的个人浅见
  16. 数组实现int随机数的阶乘(避免大数问题)
  17. jquery 判断浏览器版本
  18. 【面试 spring boot】【第十七篇】spring boot相关面试
  19. MATLAB 程序计算结果出现 复数(a+bi)问题
  20. 安装APK失败,错误代码:INSTALL_FAILED_INVALID_APK 解决方案

热门文章

  1. JVM调优总结(八)-反思
  2. 【Java8新特性】面试官:谈谈Java8中的Stream API有哪些终止操作?
  3. [JavaWeb基础] 023.线程安全(二)
  4. JAVA自学笔记(4)
  5. C实现进程间通信(管道; 共享内存,信号量)
  6. jchdl - RTL实例 - MOS6502 ALU (Verilog)
  7. Java实现 洛谷 P6183 [USACO10MAR]The Rock Game S(DFS)
  8. Java实现 LeetCode 622 设计循环队列(暴力大法)
  9. Java实现 LeetCode 551 学生出勤记录 I(暴力大法好)
  10. Java实现 蓝桥杯VIP 算法提高 色盲的民主