Dart Js-Interop函数类型参数
Dart Js-Interop function type parameters
作为我的问题 的后续行动,我想确保传递给 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 Generator。
official Dart Page about JS Interoperability.
上有更多关于使用它的信息
感谢 DefinitelyTyped project,几乎肯定有一个 TypeScript 文件可以让您执行此操作。如果没有,请改为编写其中一个,它将对 Dart 和 TypeScript 社区都有帮助。
作为我的问题
所以我想做如下事情:
@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 Generator。 official Dart Page about JS Interoperability.
上有更多关于使用它的信息感谢 DefinitelyTyped project,几乎肯定有一个 TypeScript 文件可以让您执行此操作。如果没有,请改为编写其中一个,它将对 Dart 和 TypeScript 社区都有帮助。