Параметры типа функции Dart Js-Interop

В продолжение моего вопроса Библиотека 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;
        }
    )
);

Что вызовет правильные ошибки. Но я хотел бы знать, есть ли лучший способ сделать это.


person Digital Deception    schedule 18.08.2016    source источник


Ответы (1)


Нам больше не нужно определять наши собственные файлы определений JavaScript, поскольку у Dart есть инструмент для этого из файлов TypeScript. JS Facade Generator. Дополнительную информацию об использовании можно найти на официальной странице Dart о совместимости JS. .

Благодаря проекту DefinentyTyped почти наверняка есть файл TypeScript, который позволит вам это сделать. Если нет, напишите один из них, это поможет сообществам Dart и TypeScript.

person Digital Deception    schedule 19.01.2017