接口中的typescript var是否可以声明为A或B类型

时间:2014-08-22 20:16:54

标签: typescript

我们正在设置类构造函数,以获取复制构造函数的类接口。所以基本上:

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”,它确实有效。但它确实应该总是两种类型之一。有没有办法以这种方式宣布它?在运行时这样做没有区别,但它确实可以进行更好的类型检查。

3 个答案:

答案 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,也可以使用不同类型的两个变量并进行适当分配。