2017-02-15 203 views
1

在掌握TypeScript的模塊導入/導出系統時,它仍然沒有迴避我,並且感覺像是一個只有他不能被命名的黑暗藝術...... I 「M試圖瞭解我怎樣才能使下面的導入乾淨了一點TypeScript跨多個具有相同模塊名稱的文件導入

B.ts

export module System { 
    export class Bravo { 
     constructor(n: number) { 
      console.log(`Bravo ${n}`); 
     } 
    } 
} 

A.ts

import {System as System1} from "./B"; 

export module System { 
    export class Alpha extends System1.Bravo { 
     constructor() { 
      super(123); 
     } 
    } 
} 

不喜歡這件怎麼樣

  • import { System as System1 }
  • extends System1.Bravo

這對我來說,伸出像一個突兀!有什麼辦法讓它更清潔?

  • import { System.Bravo } from "./B";
  • extends Bravo

像這樣的事情?

作爲一個側面說明,就是我真正想要實現

  • 正確使用的命名空間,即System.Foo.Bar.MyAwesomeClass
  • 將類分離到它們自己的文件中,以便構建不包含他們不需要的東西。
  • 關於上述問題,樹在搖晃嗎?
  • 使用導出/導入作爲管理依賴性的機制。

回答

1

這是一種不同的方法,但應該產生相同的結果,你正在尋找。

您可以使用文件系統將所有文件與index.ts文件放在聯合模塊中,而不是使用模塊System。所以有一個名爲System的目錄。所以,做這樣的事情:

/System/Bravo.ts

export default class Bravo { 
    constructor(n: number) { 
    console.log(`Bravo ${n}`); 
    } 
} 

/System/Alpha.ts

import Bravo from "./Bravo" 

export default class Alpha extends Bravo { 
    constructor() { 
    super(123); 
    } 
} 

然後包括index.ts文件,其中包括兩種。

/System/index.ts

import Alpha from "./Alpha"; 
import Bravo from "./Bravo"; 

export { Alpha }; 
export { Bravo }; 

然後,每當你想導入整個模塊,你會怎麼做:

import * as System from "<relativePath>/System"; 

let alphaClass = new System.Alpha(); 
let bravoClass = new System.Bravo(1); 

同樣的,如果你只是想Alpha,那麼你可以直接導入它像這樣:

import { Alpha } from "<relativePath>/System"; 

let alphaClass = new Alpha(); 
+0

糾正我,如果我錯了,但在這種情況下實際發射的代碼做n不存在於一個模塊或名稱空間中(仍然不能完全確定它們之間的區別),那麼如何使用它來將我的類型從全局範圍中分離出來? – series0ne

+0

像你一樣,模塊系統對我來說是巫術。我一直看到「模塊」已被棄用,你應該使用「名稱空間」,所以我不使用「模塊」關鍵字。 – DeeV

+0

如果您擔心類型衝突,則可以在不發生碰撞的情況下爲不同的類類型使用相同的名稱。使用「default」關鍵字,除非將其導入大括號(如{{Alpha}'),否則在導入它們時可以實際命名它們。在這種情況下,你必須做'{Alpha as AnotherAlpha}'。但是,除此之外,您可以從「./System/Alpha」導入類似'import MySuperAwesomeClass的'Alpha類,並將其用作'MySuperAwesomeClass'。 – DeeV

相關問題