飞镖映射用作节点互操作的构造函数

时间:2018-12-12 13:04:52

标签: dart interop dart2js dart-js-interop

我最近开始在Dart中进行开发。我需要在节点vm上运行Dart。当前,我需要创建一个到外部节点模块的互操作程序。

此模块仅公开构造函数。我找不到创建映射到包的Dart类的方法。

假设导出以下节点模块:

{
  Client: [Function: Client],
  Server: [Function: Server]
}

在这种情况下,我试图在Dart工作区中创建Client的新实例。我创建了以下匿名类:

@JS()
@anonymous
abstract class ClientImpl {
  // ClientImpl(String, num);
  external String get host;
  external num get port;
}

@JS()
@anonymous
abstract class Module {
  ClientImpl Client(String, num);
}

现在我想将Module类映射到节点模块

final Module _module = require('...');

void main() {
  final client = _module.Client('192.168...', 1234);
}

分析器不会显示任何键入错误,并且Dart使用dart2js可以正确编译为Javascript。现在,当我在节点VM中运行编译的js文件时,在创建Client的新实例时会出现异常。它需要new关键字。当我在已编译的js文件中手动添加新关键字时,我可以正确地实例化interop类。

我也曾尝试使用typedef来代替,但这根本没有取得任何成功。

typedef ClientFunc = ClientImpl Function(String, num);

我在网上找不到任何描述我的特定情况的示例。这里有人遇到同样的问题或知道我在做什么错吗?

预先感谢

1 个答案:

答案 0 :(得分:0)

这不完全是我的问题的答案,但是我现在正在使用一种解决方法。

const { Client, Server } = require('...')

module.exports = {
  Client: (hostAddr, port) => new Client(hostAddr, port),
  Server: (...args) => new Server(...args)
}

现在公开了一个普通函数而不是构造函数。但是,必须有一种方法可以解决上述问题,而不必为此编写代理。