令人困惑的TypeScript定义

时间:2014-03-25 21:47:59

标签: typescript

我在定义文件中发现了这个,我有点困惑,这究竟是怎么用的?

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

其中Point是

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

所以曲线是一个类,对吧?但是Point的数组是什么?我该如何使用它?数组中的索引是什么?

这可能不相关,但曲线应该传递给这样的Bezier库:

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

2 个答案:

答案 0 :(得分:3)

这些称为索引签名。

这一个

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

表示如果您使用数字索引曲线,则会得到一个点。即。

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

答案 1 :(得分:2)

即使只有Point之类的接口,TypeScript编译器也会在编译时确认对象具有兼容的签名。

所以,当你看到:

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

这意味着有一个可接受numbers的可索引属性,右侧将始终符合Point接口。索引签名在TypeScript语言规范的3.7.4中定义。

这并不意味着对象也不会支持string类型的索引属性,但是当它们为number时,它们将与Point兼容接口

此外,这意味着如果你有一个类实例(Curve可以实例化,因为它只有一个索引签名而且它还必须实现其他属性/方法):

var c : Curve = {};

只要符合界面,您就可以设置新的Point

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

在上文中,索引1已分配给与Point接口匹配的新对象(因为它具有xy属性类型数字)。你也可以这样做:

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

虽然还有另一个属性z,但对象实例仍为Point xy