在Typescript中实现同一类的两个对象之间的加法

时间:2017-10-03 07:43:48

标签: javascript oop typescript operator-overloading

前言:据我所知,这个问题可能在互联网上的某个地方有答案,但我找不到一种方法来制定它,以便谷歌给我一个答案。

上下文: 我正在开展一个小项目,涉及在2D空间中移动的物体。每个对象都有一个位置,该位置包含在Vector2D对象中(具有x坐标,y坐标和与位置相关的一些其他逻辑位)。

现在,每当我想对这些物体进行任何类型的数学运算时(例如,移动一个物体),我必须用X轴和Y轴分离我的计算,这是一个巨大的痛苦。

关于问题:有没有办法在类之间实现运算符(例如'+'或'*'),所以不必为每个单独的变量编写单独的逻辑?如果是这样,那会是什么样的?

实施例: 我想将对象A 4个单元向右移动4个单元向下移动。

目前情况:

this.ObjectA.x + = 4;

This.objectA.y + = 4;

理想情况: this.ObjectA + = new Vector2D(4,4);

2 个答案:

答案 0 :(得分:3)

简短回答:不,因为JavaScript不支持运营商重载。

TypeScript问题

到目前为止,TypeScript没有实现该功能,因为需要依赖于类型的发射 (见TypeScript/issues/5407)。

  

我们避免做的一件事是类型驱动的发射。我们的想法是,TypeScript类型在运行时没有任何影响 - 代码与您编写的类似JavaScript非常接近。鉴于此,在方法调用中替换运算符将违背该原则。

另一位TS维护者表示他们未能实现未通过ECMAScript提案流程的功能(请参阅TypeScript/issues/2319)。这背后的原因是为了避免可能的未来与官方ES语法的冲突。

的ECMAScript

esdiscuss.org上有很多关于此功能的讨论(有些可追溯到11年前......)。在one of the most recent中,发表了以下评论:

  

我建议放弃任意类型的操作符重载的所有想法 - 这种情况极不可能发生。它严重影响了优化的可能性,需要进行广泛的类型检查。此外,浏览器供应商没有兴趣实现它。

因此,运算符重载似乎极不可能将其转换为ECMAScript

我该怎么做......

在类上实现一个函数:)由于运算符重载只是一个语法糖,你可以通过函数调用实现相同的功能。所以不要这样:

this.ObjectA += new Vector2D(4,4);

这样做:

this.ObjectA.addVector(new Vector2D(4,4));

答案 1 :(得分:1)

听起来你需要类似“add”方法的东西。

以下是Playground site上的此行为示例。

以下是代码本身:

class Point {
    x: number;
    y: number;

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

    add(value: Point): void {
        this.x += value.x;
        this.y += value.y;
    }
}

class MovingAroundObject {
    position: Point = new Point();
}

const movingObject = new MovingAroundObject();
alert("movingObject.position.x: " + movingObject.position.x + " | movingObject.position.y: " + movingObject.position.y);

// A value to change position of the object
const changePosition = new Point(4, 5);

// Change the position of the object
movingObject.position.add(changePosition);
alert("movingObject.position.x: " + movingObject.position.x + " | movingObject.position.y: " + movingObject.position.y);

// Change the position of the object again
movingObject.position.add(changePosition);
alert("movingObject.position.x: " + movingObject.position.x + " | movingObject.position.y: " + movingObject.position.y);