我在定义文件中发现了这个,我有点困惑,这究竟是怎么用的?
interface Curve {
[index: number]: Point;
}
其中Point是
interface Point {
x: number;
y: number;
}
所以曲线是一个类,对吧?但是Point的数组是什么?我该如何使用它?数组中的索引是什么?
这可能不相关,但曲线应该传递给这样的Bezier库:
interface JSBezier {
distanceFromCurve(curve: Curve, point: Point): number;
...
}
答案 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
接口匹配的新对象(因为它具有x
和y
属性类型数字)。你也可以这样做:
c[2] = { x: 1, y: 100, z: -10 };
虽然还有另一个属性z
,但对象实例仍为Point
x
和y
。