Chap 4 TypeScript中的面向对象编程
1.面向对象开发的一些原则SOLID:
单一职责原则SRP:
开闭原则OCP:
里氏替换原则LSP:
接口隔离原则ISP:
依赖翻转原则DIP:
2.T雨棚script支持类class、接口interface。
3.类之间的关系:
关联:有联系但是没有从属关系,有独立生命周期,例如老师和学生
聚合:有联系属于从属关系,有独立生命周期,例如手机和电池
组合:有联系属于从属关系,子对象没有独立声明周期,例如问题和答案,问题销毁了,答案也没有存在的理由
4.支持继承特性,使用关键字extends。为了避免多继承带来的菱形问题,提供“混合”特性,用于替代多重继承。混合:
使用关键字implements实现多个父类,多个父类不在继承公共的祖先类(混合只能继承上一级的方法)
实现混合的子类中,声明implements父类中需要使用的方法
实现混合的泛型函数:
function applyMixins(derivedCtor:any, baseCtors:any[]){ baseCtors.forEach(baseCtor=>{ Object.getOwnPropertyNames(baseCtor.prototype).forEach(name=>{ if(name!=='constructor'){ derivedCtor.prototype[name]=baseCtor.prototype[name]; } } } }
混合的限制:
混合只能继承上一级的方法
如果父类有相同的方法,那么会继承传入applyMixins第二个参数最后一个类的方法
5.支持泛型类,需要声明泛型T拥有构造函数,如下写法:
function fatcory<T>():T{ var type:{new():T;}; return new type();//直接return new T();报找不到标识符T,编译错误}
6.命名空间用于组织代码,属于内部模块,默认私有,需要使用export导出公共部分。例如:
namespace app{ export class UserModel{//...}}
命名空间支持嵌套。
7.模块:与命名空间的区别是,在声明了所有的模块之后,不会使用<script>引入,而是通过模块加载器来加载。Javascript在es6之前不支持模块,常用的模块加载器有:
RequireJS:异步加载AMD
Browserify:使用CommonJS
SystemJS:通用模块加载器,支持所有模块定义语法,如ES6/CommonJS/AMD/UMD
对于Typescript,在编译时使用--module来标明使用哪种模块加载器器。
内部模块例子:
export class UserModel{}
8.Typescript支持ES6的模块语法:
class UserModel{}export {UserModl}
这里export也可以写在class前面。
9.引入模块使用import:import {UserModel,xxx} from ".models";
作者:GunnerAha
链接:https://www.jianshu.com/p/95f579060c4f