D3 다트 JS Interop을 정의했습니다. D3 개체의 값을 설정하고 호출하여 잘 작동합니다. 불행히도 D3은 setter와 getter 모두에 동일한 함수를 사용하며, 인수를 구별하기위한 인수의 양에 따라 다릅니다.다트 JS Interop 함수 오버로드 타이핑
이var arc = d3.arc().innerRadius(25);
//arc with innerRadius of 25
var radius = arc.innerRadius();
//radius is 25
내가 정의한 다트 래퍼는 다음과 같습니다 :
@JS('d3')
library d3;
import 'dart:js';
import "package:js/js.dart";
@JS("arc")
class Arc {
external Arc innerRadius(num innerRadius);
external Arc();
}
예를 들어
는 아크 객체 (자바 스크립트)이 같은 InnerRadius을 설정하고 얻을 수있는 능력을 가지고 있습니다
그리고이 같은 래퍼 정의하고 싶습니다 :
@JS("arc")
class Arc {
external Arc innerRadius(num innerRadius);
external num innerRadius();
external Arc();
}
을하지만 이름이 이미 것에 대해 불평 한정된. 다트 래퍼를 정의하여 값을 설정하고 불러올 수 있도록하려면 어떻게해야합니까?
D3는 다음과 같이 호를 정의합니다 :
function arcInnerRadius(d) {
return d.innerRadius;
}
function constant$1(x) {
return function constant() {
return x;
}
}
function arc() {
var innerRadius = arcInnerRadius;
function arc() {
var r0 = +innerRadius.apply(this, arguments);
//calculate and return path
}
arc.innerRadius = function(_) {
if(arguments.length) {
if(_ === "function") {
innerRadius = _;
} else {
innerRadius = constant$1(+_);
}
return arc;
}
return innerRadius;
}
return arc;
}
는 따라서 getter와 setter 구문은 제대로 포장하지 않습니다. innerRadius를 설정하면 내부 값이 아닌 코드에 의해 호출되지 않는 함수가 설정됩니다.
입력란을 삭제하고 매개 변수를 선택적으로 만들면 둘 다 수행 할 수있는 추악한 솔루션이 있습니다.
이 작동하지만 점에서 단점을 가지고Arc arc = new Arc()
..innerRadius(25);
num radius = arc.innerRadius();
우리의 가치의 일부를 잃게 :
@JS('d3')
library d3;
import 'dart:js';
import "package:js/js.dart";
@JS("arc")
class Arc {
external Arc();
external innerRadius([num innerRadius]);
}
이 같이 호출 할 수 있습니다 : 그래서 내 현재 솔루션은이 같은 래퍼를 정의하는 것입니다 입력 할 수 없으므로 반지름을 숫자로 강제합니다. 즉, 이는 똑같이 유효합니다.
Point<num> radius = arc.innerRadius();
그리고 런타임까지 분해되지 않습니다.
이것은 매핑 된 함수와 일치하지만 작동하지만 실제로는 유형을 사용하여 동일한 유형을 반환하는 동일한 이름의 함수를 정의 할 수 있습니다.
나는 이것을 시도했지만, D3의 구현 방식 때문에 작동하지 않습니다. 나는 이것이 작동하지 않는 이유와 함께 질문을 업데이트했다. 생각해 줘서 고마워. :) –