Dart js -互操作函数类型参数



作为我的问题Dart JS库的后续,如何传递回调函数,我想确保通过D3传递的任何函数都有正确的参数。

所以我想做如下的事情:

@JS('d3')
library d3;
import 'dart:js';
import "package:js/js.dart";
typedef num D3AccessorFunction(List<num> d, num i, List<List<num>> data);

@JS('line')
class Line {
  external Line();
  external String call (List<List<num>> data);
  external Line x(D3AccessorFunction func);
  external Line y(num func(List<num> d, num i, List<List<num>> data));
}

然后当我调用方法时:

Line line = new Line();
line.x(
    allowInterop(
        (List<num> d, num i, List<List<num>> data) {
            return d[0]+10;
        }
    )
);

如果参数匹配不正确,我想让它报错,例如

line.x(
    allowInterop(
        (List<num> d) {
            return d[0]+10;
        }
    )
);

不幸的是,allowInterop吞下了这个抱怨,您无法摆脱它。我已经创建了一个解决方案(在d3定义):

Function d3Function(D3AccessorFunction function) {
    return allowInterop(function);
}

然后我这样称呼它:

line.x(
    d3Function(
        (List<num> d, num i, List<List<num>> data) {
            return d[0]+10;
        }
    )
);

将抛出正确的错误。但是我想知道是否有更好的方法。

我们不再需要定义我们自己的JavaScript定义文件,因为Dart有一个工具可以从TypeScript文件中这样做。JS Facade生成器。在关于JS互操作性的官方Dart页面上有更多关于使用它的信息。

多亏了DefinitelyTyped项目,几乎可以肯定会有一个TypeScript文件允许你这样做。如果没有,那就自己写一个吧,这对Dart和TypeScript社区都有帮助。

最新更新