2014-03-25 100 views
0

我在一個定義文件中發現了這個,我有點困惑,應該如何使用它?令人困惑的TypeScript定義

interface Curve { 
    [index: number]: Point; 
} 

,其中一點是

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

所以曲線是一類的吧?但是什麼是點的數組,一種方法?我如何使用它?數組中的索引是什麼?

它可能不相關,但曲線,就是要傳遞給貝塞爾庫這樣的:

interface JSBezier { 
    distanceFromCurve(curve: Curve, point: Point): number; 
    ... 
} 

回答

3

這些被稱爲指數的簽名。

這一個

interface Curve { 
    [index: number]: Point; 
} 

意味着,如果指數由許多曲線,你得一分。即

var foo:Curve; 
var bar = foo [0]; // bar is inferred to be a Point 
+0

抱歉,該點在哪裏?我如何定義曲線?我是否將點賦給像foo [0] = new Point()那樣的索引? –

+0

'界面'不是'class'es – basarat

2

即使僅存在作爲Point接口這樣,打字稿編譯器將確認該對象具有在編譯時兼容的簽名。

所以,當你看到:

interface Curve { 
    [index: number]: Point; 
} 

這意味着,有一個允許numbers可索引屬性和右側總是符合Point接口。索引簽名在TypeScript語言規範的3.7.4中定義。

這並不意味着對象不會支持string類型的索引屬性,但是當它們是number時,它們將與Point接口兼容。

,也意味着,如果你有一個類的實例(Curve可以被實例化,因爲它只有一個索引的簽名,並沒有其他的屬性/方法,它也必須實現):

var c : Curve = {}; 

可以設置新Point S作爲只要它們的界面相匹配:

c[1] = { x: 1, y: 100 }; 

在上述中,索引1已被分配給一個新的對象相匹配的Point接口(因爲它有一個n xy屬性都是類型編號)。你也可以這樣做:

c[2] = { x: 1, y: 100, z: -10 }; 

雖然有其他屬性,z的對象實例仍然是一個Point具有xy

+0

非常好,非常感謝你的解釋。 –