與接口相似,同名的命名空間也將合併其成員。
因爲名稱空間同時建立了名稱空間和值,所以咱們須要瞭解它們是如何合併的。spa
要合併命名空間,每一個命名空間中聲明的導出接口的類型定義自己已合併,造成一個內部具備合併接口定義的命名空間。code
要合併命名空間值,在每一個聲明站點,若是已存在具備給定名稱的命名空間,則經過獲取現有命名空間並將第二個命名空間的導出成員添加到第一個命名空間來進一步擴展它。blog
在此示例中,Animals的聲明合併:接口
namespace Animals { export class Zebra { } } namespace Animals { export interface Legged { numberOfLegs: number; } export class Dog { } }
至關於:ip
namespace Animals { export interface Legged { numberOfLegs: number; } export class Zebra { } export class Dog { } }
這種命名空間合併模型是一個有用的起點,但咱們還須要瞭解非導出成員會發生什麼。
非導出成員僅在原始(未合併)命名空間中可見。
這意味着在合併以後,來自其餘聲明的合併成員沒法看到未導出的成員。get
在這個例子中咱們能夠更清楚地看到這一點:io
namespace Animal { let haveMuscles = true; export function animalsHaveMuscles() { return haveMuscles; } } namespace Animal { export function doAnimalsHaveMuscles() { return haveMuscles; // Error, because haveMuscles is not accessible here } }
因爲未導出hasMuscles,所以只有共享相同未合併命名空間的animalsHaveMuscles函數才能看到該符號。
doAnimalsHaveMuscles函數,即便它是合併的Animal命名空間的一部分,也沒法看到此未導出的成員。入門