TypeScript - 将返回类型定义为输入类型

时间:2018-04-26 10:01:35

标签: typescript generics

因此,为简化起见,假设我有一个方法如下

<script src="https://www.google.com/recaptcha/api.js?onload=showSweetAlertRecaptcha"></script>
<script src="https://cdn.jsdelivr.net/npm/sweetalert2@8"></script>

正如您所看到的,实际逻辑完全相同,这使得复制它有点愚蠢。在调用方法并传递它(例如,sum(o: Point | Vector): Point | Vector { if (o instanceof Point) { return new Point(o.x + this.x, o.y + this.y, o.z + this.z) } if (o instanceof Vector) { return new Vector(o.x + this.x, o.y + this.y, o.z + this.z) } } 对象时,返回类型未正确派生。我必须对Point做一个明确的演员。

我可以使用通用类型并将参数声明为Point,但当然它不会识别Txy变量。

我的问题有点像this一个,但区别我的类型不是数组而且问题没有答案。

在TypeScript中可以更好地解决这个问题吗?

2 个答案:

答案 0 :(得分:2)

您可以显式地传递具有泛型约束的构造函数。

function sum<T extends Point | Vector>(c: new (a: number, b: number,c: number) => T, o: T): (T) {  
  return new c(o.x + this.x, o.y +  this.y, o.z + this.z); 
}

let t = x.sum(Point, new Point(1, 2, 3));

答案 1 :(得分:0)

我认为您应该使用带限制的泛型类型,例如:

export abstract class SumableClass {

    public sum<T extends SumableClass >(o: T): T {
        return o.constructor(o.x + this.x, o.y + this.y, o.z + this.z);
    }

    constructor(public x: number, public y: number, public z: number) {

    }
}

还定义了一个抽象(SumableClass),Point和Vector应该从它继承