2015-11-22 38 views
1

下似乎是合法的打字稿:模塊和接口可以有相同的名稱?

interface Vec2 { 
    x: number; 
    y: number; 
} 

module Vec2 { 
    export function create(x?: number, y?: number) : Vec2 { 
     return {x: x||0, y: y||0}; 
    } 
    export function length(v: Vec2) : number { 
     return Math.sqrt(v.x * v.x + v.y * v.y); 
    } 
} 

const v:Vec2 = Vec2.create(1, 2); 
const len = Vec2.length(v); 

因爲你有一個結構類型VEC 2和上VEC 2結構操作功能的模塊,它是有點兒整潔。 我想知道這是不是一個好主意。最初我以爲我應該得到一個編譯器錯誤。

回答

2

可以與接口做到這一點,...

  • 模塊/命名空間
  • 變量
  • 的環境類

編譯器實際上將發出警告如果你試圖以一種會導致編譯器危險的方式來做到這一點 - 比如用一個接口和一個類(即它不能推斷出你的意思)。

在某些情況下,它可以使用這個技巧很有意義,它通常在定義文件中使用,並且具有與同名變量配對的接口。

酸性測試是:當您使用此功能時,是否會導致您在代碼中看到Vec2時必須考慮自己的意思?如果是這樣,你應該避免它,因爲它不必要地增加了複雜性。它是明顯的或不相關的(因爲它在定義文件中) - 然後繼續使用它。

+0

謝謝。我會嘗試嘗試一下,看看我是否設法以某種方式將自己與它混淆。我發現在結構(接口)上運行的函數很有用,因爲它允許我更輕鬆地在同一個應用程序中使用three.js向量和cannon.js向量。但是當函數和數據不屬於同一類時,我不知道如何命名這些東西。 – pixelmike

相關問題