2015-11-22 36 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

相关问题