TypeScript基礎入門之宣告合併(二)
宣告合併
合併名稱空間
與介面類似,同名的名稱空間也將合併其成員。
由於名稱空間同時建立了名稱空間和值,因此我們需要了解它們是如何合併的。
要合併名稱空間,每個名稱空間中宣告的匯出介面的型別定義本身已合併,形成一個內部具有合併介面定義的名稱空間。
要合併名稱空間值,在每個宣告站點,如果已存在具有給定名稱的名稱空間,則通過獲取現有名稱空間並將第二個名稱空間的匯出成員新增到第一個名稱空間來進一步擴充套件它。
在此示例中,Animals的宣告合併:
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 { } }
這種名稱空間合併模型是一個有用的起點,但我們還需要了解非匯出成員會發生什麼。
非匯出成員僅在原始(未合併)名稱空間中可見。
這意味著在合併之後,來自其他宣告的合併成員無法看到未匯出的成員。
在這個例子中我們可以更清楚地看到這一點:
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名稱空間的一部分,也無法看到此未匯出的成員。
未完待續...