В продолжение моего вопроса Библиотека JS Dart, как передавать функции обратного вызова, я хочу убедиться, что любые функции, передаваемые в 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;
}
)
);
Что вызовет правильные ошибки. Но я хотел бы знать, есть ли лучший способ сделать это.