Typescript的interface、class和abstract class

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

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

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

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赋值给一个变量this

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

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

2. interface和class

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

如今咱们来看class,class首先也具备interface的能力,描述一个形状,或者说表明一种类型。此外class还提供了实现,也就是说能够被实例化;ip

因此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 能够提供部分的方法实现,这些方法能够被子类调用。

相关文章
相关标签/搜索