如何在Typescript接口中引用self类型(对于IClonable接口)

时间:2016-04-20 12:37:08

标签: typescript

我需要一个定义IClonable成员的clone()接口,它返回实现它的类的实例。

如果可能,我如何指出clone()的返回类型与调用它的类相同?

interface IClonable {
    clone(): ???
}

我知道我可以用下面的泛型做到这一点,但这看起来过于冗长

interface IClonable<T> {
    clone(): T
}

2 个答案:

答案 0 :(得分:7)

非常简单地将返回类型设置为this

interface IClonable {
    clone(): this;
}

答案 1 :(得分:2)

你是对的,使用泛型是做到这一点的方法,即使它很冗长..

你也可以:

interface IClonable {
    clone(): any;
}

interface IClonable {
    clone(): any;
    clone<T>(): T;
}

interface IClonable {
    clone(): IClonable;
}

但使用泛型可能是最好的方法。

修改

@Silvermind下面的评论让我检查了clone<T>(): T的建议代码,我错了,因为它没有编译。
首先,这是一个显示我的意思的代码:

class Point implements IClonable {
    private x: number;
    private y: number;

    constructor(x: number, y: number) {
        this.x = x;
        this.y = y;
    }

    public clone<T>(): T {
        return <T> new Point(this.x, this.y);
    }
}

var p1 = new Point(1, 2);
var p3 = p1.clone<Point>();

基本上是在clone方法中执行强制转换而不是转换返回的值 但是<T> new Point(this.x, this.y)会产生:

  

既不键入&#39;点'也不键入&#39; T&#39;可分配给对方