TS-聲明合并

TS聲明合并是指將兩個或者兩個以上的具有相同名稱的獨立聲明合并成一個定義巴粪,且該定義具有所合并的聲明的所有功能通今。
TS聲明可分為:

  • 合并接口聲明
  • 合并命名空間
  • 命名空間和類、函數(shù)肛根、枚舉合并
  • 不可合并部分
  • 模態(tài)擴展
  • 全局?jǐn)U展

接口聲明合并

  • 非函數(shù)成員接口合并
interface People {
  name: string;
}
interface People {
  age: number
}
//合并后的接口
interface People {
  name: string,
  age: number
}
  • 函數(shù)成員合并
interface Cloner {
  clone(animal: Animal): Animal;
}

interface Cloner {
  clone(animal: Sheep): Sheep;
}

interface Cloner {
  clone(animal: Dog): Dog;
  clone(animal: Cat): Cat;
}
//合并后的接口
interface Cloner {
  clone(animal: Dog): Dog;
  clone(animal: Cat): Cat;
  clone(animal: Sheep): Sheep;
  clone(animal: Animal): Animal;
}
//注意: 1.合并后接口屬性的排序方式:每組接口里的聲明順序保持不變辫塌,但各組接口之間的順序是后來的接口重載出現(xiàn)在靠前位置
2.如果接口的函數(shù)參數(shù)含有單個字符串文字類型,它將會排到重載列表的頂部

合并命名空間

namespace Animals {
  export class Zebra {}
}

namespace Animals {
  export interface Legged {
    numberOfLegs: number;
  }
  export class Dog {}
}
//合并為
namespace Animals {
  export interface Legged {
    numberOfLegs: number;
  }

  export class Zebra {}
  export class Dog {}
}
//注意:非導(dǎo)出成員僅在其原有的(合并前的)命名空間內(nèi)可見派哲。
//這就是說合并之后臼氨,從其它命名空間合并進(jìn)來的成員無法訪問非導(dǎo)出成員。
namespace Animal {
  let haveMuscles = true;
  export let havename = false;
  export function animalsHaveMuscles() {
    return haveMuscles;
  }
}

namespace Animal {
  export function doAnimalsHaveMuscles() {
    //return haveMuscles; // Error,是不能訪問的因為 haveMuscles沒被導(dǎo)出
    return havename;// OK芭届,havename被export導(dǎo)出
  }
}

命名空間和類储矩、函數(shù)感耙、枚舉合并

命名空間和類的合并

class Album {
    label: Album.AlbumLabel; //可訪問合并后導(dǎo)出的類
}
namespace Album {
    export class AlbumLabel { }
}

命名空間和函數(shù)的合并

function buildLabel(name: string): string {
  return buildLabel.prefix + name + buildLabel.suffix; //可訪問合并中的命名空間中的屬性
}

namespace buildLabel {
  export let suffix = "";
  export let prefix = "Hello, ";
}

console.log(buildLabel("Sam Smith"));

命名空間和枚舉合并

enum Color {
    red = 1,
    green = 2,
    blue = 4
}

namespace Color {
    export function mixColor(colorName: string): number {
        if (colorName == "white") {
            return Color.red + Color.green + Color.blue; //可以訪問合并的枚舉類型屬性
        }
        else if (colorName == "red") {
            return Color.red ;
        }
        else if (colorName == "white") {
            return Color.red + Color.blue;
        }else{
          return 1;
        }
    }
}

不可合并部分

TS中類不能與其他類或變量合并;詳細(xì)可以參考TypeScript中的Mixins椰苟;

模塊擴展

js中可在對象原型上拓展現(xiàn)有的屬性和方法抑月,TS中可以通過模塊擴展來實現(xiàn)

  // observable.ts
export class Observable<T> {
  // ... implementation left as an exercise for the reader ...
}

// map.ts
import { Observable } from "./observable";
declare module "./observable" {
  interface Observable<T> {
    map<U>(f: (x: T) => U): Observable<U>;
  }
}
Observable.prototype.map = function (f) {
  // ... another exercise for the reader
};

// consumer.ts
import { Observable } from "./observable";
import "./map";
let o: Observable<number>;
o.map((x) => x.toFixed());

全局?jǐn)U展

TS可以從模塊內(nèi)部將聲明添加到全局范圍:

// observable.ts
export class Observable<T> {
  // ... still no implementation ...
}

declare global {
  interface Array<T> {
    toObservable(): Observable<T>;
  }
}

Array.prototype.toObservable = function () {
  // ...
};
添加后全局可使用Array.prototype.toObservable方法;
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末舆蝴,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子题诵,更是在濱河造成了極大的恐慌洁仗,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,682評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件性锭,死亡現(xiàn)場離奇詭異赠潦,居然都是意外死亡,警方通過查閱死者的電腦和手機草冈,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,277評論 3 395
  • 文/潘曉璐 我一進(jìn)店門她奥,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人怎棱,你說我怎么就攤上這事哩俭。” “怎么了拳恋?”我有些...
    開封第一講書人閱讀 165,083評論 0 355
  • 文/不壞的土叔 我叫張陵凡资,是天一觀的道長。 經(jīng)常有香客問我谬运,道長隙赁,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,763評論 1 295
  • 正文 為了忘掉前任梆暖,我火速辦了婚禮伞访,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘轰驳。我一直安慰自己厚掷,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,785評論 6 392
  • 文/花漫 我一把揭開白布滑废。 她就那樣靜靜地躺著蝗肪,像睡著了一般。 火紅的嫁衣襯著肌膚如雪蠕趁。 梳的紋絲不亂的頭發(fā)上薛闪,一...
    開封第一講書人閱讀 51,624評論 1 305
  • 那天,我揣著相機與錄音俺陋,去河邊找鬼豁延。 笑死昙篙,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的诱咏。 我是一名探鬼主播苔可,決...
    沈念sama閱讀 40,358評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼袋狞!你這毒婦竟也來了焚辅?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,261評論 0 276
  • 序言:老撾萬榮一對情侶失蹤苟鸯,失蹤者是張志新(化名)和其女友劉穎同蜻,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體早处,經(jīng)...
    沈念sama閱讀 45,722評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡湾蔓,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,900評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了砌梆。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片默责。...
    茶點故事閱讀 40,030評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖咸包,靈堂內(nèi)的尸體忽然破棺而出桃序,到底是詐尸還是另有隱情,我是刑警寧澤诉儒,帶...
    沈念sama閱讀 35,737評論 5 346
  • 正文 年R本政府宣布葡缰,位于F島的核電站,受9級特大地震影響忱反,放射性物質(zhì)發(fā)生泄漏泛释。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,360評論 3 330
  • 文/蒙蒙 一温算、第九天 我趴在偏房一處隱蔽的房頂上張望怜校。 院中可真熱鬧,春花似錦注竿、人聲如沸茄茁。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,941評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽裙顽。三九已至,卻和暖如春宣谈,著一層夾襖步出監(jiān)牢的瞬間愈犹,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,057評論 1 270
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留漩怎,地道東北人勋颖。 一個月前我還...
    沈念sama閱讀 48,237評論 3 371
  • 正文 我出身青樓,卻偏偏與公主長得像勋锤,于是被迫代替她去往敵國和親饭玲。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,976評論 2 355

推薦閱讀更多精彩內(nèi)容