我们正在设置类构造函数,以获取复制构造函数的类接口。所以基本上:
interface IPoint {
var x : number;
var y : number;
}
class Point implements IPoint {
var x : number;
var y : number;
constructor (src : IPoint) {
this.x = src.x;
this.y = src.y;
}
public getTotal() : number {
return x + y;
}
}
我们这样做是因为我们从REST服务器获取此对象作为JSON,并且还将对象传递给Web工作者或从Web工作者传递对象。在这些情况下,我们收到的对象是接口,我们有数据,但不是方法。复制构造函数适用于从完整对象创建一个以及仅使用JSON的情况。
但是我们针对以下情况遇到了问题:
interface IPoint {
var coordinates : (List or number[])
}
class Point implements IPoint {
var coordinates : List
constructor (src : IPoint) {
// do an isArray() to initialize
}
public getTotal() : number {
return // sum of all coordinates in the list
}
}
当我们从JSON获取对象时,坐标是一个数组。在对象中,它是一个List(来自collections.ts)。
我们目前正在界面中定义“coordinates:any”,它确实有效。但它确实应该总是两种类型之一。有没有办法以这种方式宣布它?在运行时这样做没有区别,但它确实可以进行更好的类型检查。
答案 0 :(得分:2)
我的建议是为坐标(List或number [])定义一个集合类型,并确保构造函数可以接受任何输入,然后将输入转换为您需要的类型。
答案 1 :(得分:1)
好吧,假设List
支持[]
运算符,您可以这样做:
interface IIndexable<T> {
[index: number]: T
}
interface IPoint {
coordinates : IIndexable<number>
}
答案 2 :(得分:0)
但它确实应该总是两种类型之一。
联合类型https://github.com/Microsoft/TypeScript/issues/14仍将在打字稿中实现。
您可以使用已知的any
,也可以使用不同类型的两个变量并进行适当分配。