介紹
除了傳統(tǒng)的面向?qū)ο罄^承方式古劲,還有流行一種通過可重用組件創(chuàng)建類的方式滑绒,就是聯(lián)合另一個簡單類的代碼
// TS中使用混入: Disposable Mixin
class Disposable {
isDisposed: boolean;
dispose() {
this.isDisposed = true;
}
}
// Activatable Mixin
class Activatable {
isActive: boolean;
activate() {
this.isActive = true;
}
deactivate() {
this.isActive = false;
}
}
// 沒使用extends而是使用implements踱阿。 把類當(dāng)成了接口佛点,僅使用Disposable和Activatable的類型而非其實現(xiàn)
class SmartObject implements Disposable, Activatable {
constructor(){
setInterval(() => {
console.log(this.isActive + ' : ' + this.isDisposed)
}, 500)
}
interact(){
this.activate();
}
// 為將要mixin進(jìn)來的屬性方法創(chuàng)建出占位屬性。 這告訴編譯器這些成員在運行時是可用的。 這樣就能使用mixin帶來的便利,雖說需要提前定義一些占位屬性
isDisposed: boolean = false;
dispose: () => void;
isActive: boolean = false;
activate: () => void;
deactivate: () => void;
}
applyMixins(SmartObject, [Disposable, Activatable]);
let smartObj = new SmartObject();
setTimeout(() => {
smartObj.interact()
}, 1000)
// 它會遍歷mixins上的所有屬性史侣,并復(fù)制到目標(biāo)上去回季,把之前的占位屬性替換成真正的實現(xiàn)代碼
function applyMixins (derivedCtor: any, baseCtors: any[]){
baseCtors.forEach(baseCtors => {
Object.getOwnPropertyNames(baseCtors.prototype).forEach(name => {
derivedCtor.prototype[name] = baseCtors.prototype[name];
})
})
}
三斜線指令
三斜線指令是包含單個XML標(biāo)簽的單行注釋,注釋的內(nèi)容會作為編譯器指令使用
三斜線引用告訴編譯器在編譯過程中要引入的額外的文件
三斜線指令僅可以放在包含他的文件的最頂端,一個三斜線指令的前面只能出現(xiàn)單行或多行注釋,這包括其他的三斜線指令
如果他出現(xiàn)在一個語句或聲明之后劲弦,那么他們會被當(dāng)做普通的單行注釋,并且不具有特殊的含義
預(yù)處理輸入文件:
解析:編譯器會對輸入文件進(jìn)行預(yù)處理來解析所有三斜線引用指令轴踱,在這個過程中,額外的文件會加到編譯過程中
查找:查找文件是以一些根文件開始(命令中指定文件或在tsconfig.json中的files列表里的文件)细办,這些根文件按指定的順序進(jìn)行預(yù)處理坚踩。
處理順序:三斜線引用以他們在文件里出現(xiàn)的順序,使用深度優(yōu)先的方式解析
錯誤:引用不存在的文件會報錯,一個文件用三斜線指令引用自己會報錯
noResolve:如果指定了noResolve編譯選項,三斜線引用會被忽略鸵隧,他們不會增加新文件豆瘫,也不會改變給定文件的順序
若要在.ts文件里聲明一個對@types包的依賴略步,使用--types命令行選項或在tsconfig.json里指定
// 下面指令是三斜線指令中最常見的一種杭煎,它用于聲明文件間的依賴
/// <reference path = "..." />
// 表明這個文件使用了 @types/node/index.d.ts里面聲明的名字雷恃; 并且人弓,這個包需要在編譯階段與聲明文件一起被包含進(jìn)來
// 僅當(dāng)在你需要寫一個d.ts文件時才使用這個指令
/// <reference types="node" />
// 這個指令把一個文件標(biāo)記成默認(rèn)庫着逐。 你會在 lib.d.ts文件和它不同的變體的頂端看到這個注釋
/// <reference no-default-lib="true"/>
// 當(dāng)一些工具需要處理生成的模塊時會產(chǎn)生問題票从,比如 r.js。
// amd-module指令允許給編譯器傳入一個可選的模塊名:
/// <amd-module />
///<amd-module name='NamedModule'/>