【问题标题】:Dart mapping Function as constructor with node interopDart 映射函数作为具有节点互操作的构造函数
【发布时间】:2019-05-13 14:20:32
【问题描述】:

我最近开始使用 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 文件时,我在创建客户端的新实例时遇到异常。它需要new 关键字。当我在编译的js文件中手动添加新关键字时,我可以正确实例化互操作类。

我也尝试改用typedef,但根本没有成功。

typedef ClientFunc = ClientImpl Function(String, num);

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

提前致谢

【问题讨论】:

    标签: dart interop dart2js dart-js-interop


    【解决方案1】:

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

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

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

    【讨论】:

      猜你喜欢
      • 2018-10-29
      • 2023-03-04
      • 2013-01-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-10-13
      相关资源
      最近更新 更多