2016-08-18 2 views
1

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(); 

그리고 런타임까지 분해되지 않습니다.

이것은 매핑 된 함수와 일치하지만 작동하지만 실제로는 유형을 사용하여 동일한 유형을 반환하는 동일한 이름의 함수를 정의 할 수 있습니다.

답변

0

에게 ... 거의 정확하게 다음과 같은 방식으로 사용되는 게터를 제외하고, 요구하는 우리를 할 것 Dart가 TypeScript 파일에서 그렇게하는 도구를 가지고 있기 때문에 더 이상 자체 JavaScript 정의 파일을 정의 할 필요가 없습니다. JS Facade Generator. official Dart Page about JS Interoperability에서이 정보를 사용하는 방법에 대해 자세히 알아보십시오.

덕분에 DefinitelyTyped project 덕분에 거의 확실하게 TypeScript 파일을 만들 수 있습니다. 그렇지 않다면 그 중 하나를 쓰면 다트와 타입 스크립트 커뮤니티에 도움이됩니다.

1

질문을 올바르게 이해하면 innerRadius (value)를 설정하고 innerRadius를 가져올 수 있기를 원합니다. 이를 위해 나는 ... 다음을 수행 할

external Arc set innerRadius(num value); 
external num get innerRadius; 

num radius = arc.innerRadius; 
+0

나는 이것을 시도했지만, D3의 구현 방식 때문에 작동하지 않습니다. 나는 이것이 작동하지 않는 이유와 함께 질문을 업데이트했다. 생각해 줘서 고마워. :) –