在编译为JavaScript时,有没有办法在Haxe中对别名进行别名?

问题描述 投票:3回答:1

我有以下两个类:

package geometer;

class Vector2Impl {
  public var x: Float;
  public var y: Float;

  ... operations and methods...
package geometer;

@:forward(x, y)
abstract Vector2(Vector2Impl) from Vector2Impl to Vector2Impl {
  public
  function new(x: Float, y: Float) {
    this = new Vector2Impl(x, y);
  }

  ... operator overloads ...
}

我这样做了所以我可以在Vector2中重载运算符。这一切都在Haxe内部工作正常,但是,我们从Haxe编译为JavaScript。然后我们的输出JavaScript用于mocha测试。

不幸的是,JS代码中完全省略了声明abstract的类(嗯,这不完全正确,但它们看起来像:

var geometer__$Vector2_Vector2_$Impl_$ = {};
geometer__$Vector2_Vector2_$Impl_$.__name__ = true;
geometer__$Vector2_Vector2_$Impl_$._new = function(x,y) {
    return new geometer_Vector2Impl(x,y);
};

因此,在我的测试中,我被迫使用Vector2而不是使用Vector2Impl。这有点痛苦,因为a)它需要更多的输入,并且b)它暴露了Haxe客户端和JavaScript客户端之间不一致的接口。我可以处理它,但由于Haxe没有完全编译Vector2类型,我想知道是否有一种方法可以在生成的Vector2Impl文件中将Vector2别名为.js。这样,而不是在我的测试中执行以下操作:

'use strict';

let expect = require('chai').expect;
let library = require('../../dist/library.js');
let geometer = library.geometer;

// Unfortunately, abstract classes (Vector2) are not available in JS-land.
let Vector2Impl = geometer.Vector2Impl;

require('../nyc-reporter');

describe('Vector2Impl', function() {
  describe ('#new', function() {
    it ('should create a new Vector2Impl object', function() {
      let v = new Vector2Impl(20.5, 100.0);

      expect(v.x).to.eq(20.5);
      expect(v.y).to.eq(100.0);
    });
  });
});

我能做到这一点:

'use strict';

let expect = require('chai').expect;
let library = require('../../dist/library.js');
let geometer = library.geometer;

// Unfortunately, abstract classes (Vector2) are not available in JS-land.
let Vector2 = geometer.Vector2;

require('../nyc-reporter');

describe('Vector2', function() {
  describe ('#new', function() {
    it ('should create a new Vector2 object', function() {
      let v = new Vector2(20.5, 100.0);

      expect(v.x).to.eq(20.5);
      expect(v.y).to.eq(100.0);
    });
  });
});

显然,我知道我不能在JavaScript中使用运算符重载,因为语言不支持它,但如果我可以通过调用Vector2Impl来使用Vector2中提供的所有其他方法,那将是非常棒的。

注意:我知道我可以这样做:

let Vector2 = geometer.Vector2Impl;

但是,如果可能的话,我宁愿客户甚至不知道Vector2Impl类。

javascript types alias haxe
1个回答
4
投票

你可以简单地用Vector2DImpl注释@:expose metadata

@:expose("geometer.Vector2D")
class Vector2Impl {
    ...
}

这包括它在$hx_exports作为geometer.Vector2D

© www.soinside.com 2019 - 2024. All rights reserved.