Chap 4 TypeScript中的面向?qū)ο缶幊?/h3>
1.面向?qū)ο箝_發(fā)的一些原則SOLID:
- 單一職責(zé)原則SRP:
- 開閉原則OCP:
- 里氏替換原則LSP:
- 接口隔離原則ISP:
- 依賴翻轉(zhuǎn)原則DIP:
2.T雨棚script支持類class、接口interface。
3.類之間的關(guān)系:
- 關(guān)聯(lián):有聯(lián)系但是沒有從屬關(guān)系,有獨(dú)立生命周期,例如老師和學(xué)生
- 聚合:有聯(lián)系屬于從屬關(guān)系,有獨(dú)立生命周期,例如手機(jī)和電池
- 組合:有聯(lián)系屬于從屬關(guān)系,子對(duì)象沒有獨(dú)立聲明周期,例如問題和答案,問題銷毀了,答案也沒有存在的理由
4.支持繼承特性,使用關(guān)鍵字extends。為了避免多繼承帶來的菱形問題,提供“混合”特性,用于替代多重繼承?;旌希?/p>
- 使用關(guān)鍵字implements實(shí)現(xiàn)多個(gè)父類,多個(gè)父類不在繼承公共的祖先類(混合只能繼承上一級(jí)的方法)
- 實(shí)現(xiàn)混合的子類中,聲明implements父類中需要使用的方法
- 實(shí)現(xiàn)混合的泛型函數(shù):
function applyMixins(derivedCtor:any, baseCtors:any[]){
baseCtors.forEach(baseCtor=>{
Object.getOwnPropertyNames(baseCtor.prototype).forEach(name=>{
if(name!=='constructor'){
derivedCtor.prototype[name]=baseCtor.prototype[name];
}
}
}
}
混合的限制:
- 混合只能繼承上一級(jí)的方法
- 如果父類有相同的方法,那么會(huì)繼承傳入applyMixins第二個(gè)參數(shù)最后一個(gè)類的方法
5.支持泛型類,需要聲明泛型T擁有構(gòu)造函數(shù),如下寫法:
function fatcory<T>():T{
var type:{new():T;};
return new type();//直接return new T();報(bào)找不到標(biāo)識(shí)符T,編譯錯(cuò)誤
}
6.命名空間用于組織代碼,屬于內(nèi)部模塊,默認(rèn)私有,需要使用export導(dǎo)出公共部分。例如:
namespace app{
export class UserModel{//...}
}
命名空間支持嵌套。
7.模塊:與命名空間的區(qū)別是,在聲明了所有的模塊之后,不會(huì)使用<script>引入,而是通過模塊加載器來加載。Javascript在es6之前不支持模塊,常用的模塊加載器有:
- RequireJS:異步加載AMD
- Browserify:使用CommonJS
- SystemJS:通用模塊加載器,支持所有模塊定義語法,如ES6/CommonJS/AMD/UMD
對(duì)于Typescript,在編譯時(shí)使用--module來標(biāo)明使用哪種模塊加載器器。
內(nèi)部模塊例子:
export class UserModel{}
8.Typescript支持ES6的模塊語法:
class UserModel{}
export {UserModl}
這里export也可以寫在class前面。
9.引入模塊使用import:import {UserModel,xxx} from ".models";