2016-10-07 38 views
1

我有一個接口,我只想在命名空間(內部模塊)內使用,它不應該在名稱空間外使用。TypeScript:如何在名稱空間內使用內部接口

實例接口:

namespace Test { 
    interface IInterface { 
     getId(): number; 
     getName(): string; 
    } 
} 

不幸的是,我得到一個錯誤,當我嘗試,如果我不要導出接口(我不希望)相同的命名空間內實現這個接口。

實現類:

namespace Test { 
    class Implementer implements IInterface { 
     private location: Location; 

     public getId(): number { 
      return 1; 
     } 

     public getName(): string { 
      return "implementer name"; 
     } 
    } 
} 

其中給出:TS2304:找不到名稱 'IInterface'。 'Implementer.ts'中的

注意類型'Location'的私有成員,它也是我自己在同一個命名空間中定義的新類型/類,並且是使用命名空間的真正原因,因爲類型'Location'已經存在於全局空間中。

類具有名稱衝突如果使用的話外名稱空間:

namespace Test { 
    class Location { 
     private name: string = null; 
     constructor(name: string) { 
      this.name = name; 
     } 
    } 
} 

此外:我不使用任何模塊,我將一些類型的從JavaScript到打字原稿類。使用/// <reference path="IInterface.ts" />幫手不起作用(這裏不是問題)。我也不想介紹任何模塊加載器。

那麼如何在不導出它的情況下在相同的命名空間中使用我的接口呢?

+0

也許相關:http://stackoverflow.com/questions/39827281/modules-vs-namespaces-what-is-the-correct-way-to-organize-a-large-typescript-p/39827997#39827997 – Paleo

+0

另一個問題沒有提到內部接口或名稱步驟或模塊中接口的可訪問性 – Huupke

+0

是的,但是如果您啓動一個新項目,也許應該考慮切換到模塊。這只是一個建議。 :) – Paleo

回答

1

我首先回答最後一個問題:「如果在名稱空間外部使用名稱衝突的類」。瀏覽器中已存在一個global object Location。您可以在模塊或命名空間中將此名稱用於您的課程。否則,你將不得不選擇另一個名字。

然後,你想拆分一個命名空間。只是export成員IInterface,以揭露它的IIFE外:

namespace Test { 
    export interface IInterface { 
     getId(): number; 
     getName(): string; 
    } 
} 

說明

the handbook

命名空間簡單地命名爲全局命名空間中的JavaScript對象。

這裏有一個例子(見代碼in the TS Playground):

namespace Test { 
    export let name = 'abc' 
} 

namespace Test { 
    let message = 'Hello, ' + name; 
} 

編譯後,這裏是JavaScript代碼:

var Test; 
(function (Test) { 
    Test.name = 'abc'; 
})(Test || (Test = {})); 

var Test; 
(function (Test) { 
    var message = 'Hello, ' + Test.name; 
})(Test || (Test = {})); 

的命名空間Test「簡單地命名爲全局命名空間中的JavaScript對象「。您可以觀察到變量message無法在其IIFE之外重用。即使我們爲相同的全局變量(命名空間)Test創建第三個IIFE。

+1

首先導出會使界面在名稱空間或模塊外部可訪問,因此不需要。已經存在的名稱的問題不應該通過重命名我自己的對象來處理。命名空間和模塊主要是爲了解決這個問題。 – Huupke

+0

@Huupke,我添加了一個解釋。 – Paleo

相關問題