×

Learning TypeScript 读书笔记3

96
GunnerAha
2018.06.09 10:33 字数 612

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";

学习笔记
Web note ad 1