TypeScript 高级语法——Class(三)

和interface一样,类也有泛型机制,写法同泛型接口。泛型无法用于静态字段、静态类,因为静态资源在类定义时就会被确定下来而不是在实例化时。
面向对象的编程中一定会存在多态的概念,引用TS官方的例子,这个例子中的“this is Type”作为基础类型守卫存在。以isFile为例this is FileRep守卫标记了这个函数中的this为FileRep,以此为前提this instanceof FileRep才没有报错。这种机制让TS良好的在多态的环境下运行(这个例子中FileRep、Directory、Networked都是FileSystemObject的子类)。
在TS中类、方法、字段可以是抽象的,如上例中抽象方法getName是不可以提供具体实现细节的,也就是说他只有函数签名;因为抽象方法getName是类Base内的函数成员所以类Base也必须是抽象的。
在这个抽象类Base中存在着有具体实现的printName方法,也就是说抽象类可以类比为具有一部分具体实现的接口(interface),并且不同于普通的类,抽象类与接口相同不会被转换成JS代码。从完整性角度来看抽象类缺乏完整的具体实现所以不可被实例化、从无法编译为JS代码来看抽象类是缺乏运行时体现的所以无法被实例化。
继承抽象类的类必须实现抽象类的抽象部分,上例中Derived为抽象方法getName提供了具体实现。
在TS的类型系统中,不同类型之间是可以单向赋值的,前提是被赋值的一方一定是赋值方的子集(Employee类包含所有Person类的组成部分)。
上例是一个极端的例子fn函数可以接受任何对象,因为Empty是空对象(是任何对象的子集);