2011-08-15 4 views
2

나는 그것이 무엇인지 이해한다 - 나는 복잡한 타입을위한 별칭을 정의하고 그것을 문서에서 사용할 수 있다는 이점을 알 수있다. 그래서 당신은 ... 같은구글 클로저의 typedef는 실제로 무엇을합니까?

/** @typedef {{x:number, y:number}} */ 
example.Point; 

을 유형 뭔가를 정의 할 수 있습니다 ... 그리고 함수 같은 뭔가를 기록하는 데 사용할 ...

/** 
* @param {example.Point} point 
* @return {example.Point} 
*/ 
example.functionThatTakesAPointAndReturnsAPoint(point) { 
.... 
} 

을하지만 일이 잘 모르겠어요 약 문서 및 컴파일러의 정적 유형 검사에만 사용되는 경우 typedef에 해당 JavaScript 행이 필요한 이유는 무엇입니까? 별칭을 문서 주석 블록 내에 완전히 정의 할 수 없었습니까? 그리고 코드를 컴파일하지 않고 직접 제공 한 경우 typedef 주석 다음에 JavaScript 인터프리터가 해당 코드 행에서 무엇을 할 것입니까?

답변

2

확인하고 바로 사용할 수있는 구문을 향상시킵니다. 표준 패턴과 일치하기 때문에 no-op 속성 액세스에서 별칭을 가져 오는 것이 더 쉽다고 가정합니다.

+0

고마워요. 그게 제가 찾고있는 정보 중 하나라고 생각합니다. 그래서 typedef 이후의 JavaScript 라인은 아무 것도하지 않습니다 ... 그리고 그것은 기본적으로 편의를 위해 구현되었습니다. – IanR

0

설명서 만이 아닙니다. 또한 클로저 컴파일러를 사용하여 스크립트를 컴파일 할 때 경고 메시지를 표시합니다.

클로저 컴파일러는 향상된 최적화 및 경고를 제공하기 위해 JavaScript 변수에 대한 데이터 유형 정보를 사용할 수 있습니다. JavaScript, 그러나 형식을 선언 할 방법이 없습니다.

+1

감사합니다. 나는 그 비트를 얻습니다. 왜 JavaScript 코드가 필요한지 혼란 스러웠습니다. 왜, 예를 들어 typedef는/** @typedef {{x : number, y : number}} example.Point * /와 같은 것이 될 수 없습니다. 나는 자바 스크립트를 처음으로 접했을 뿐이므로 제대로 이해하지 못하는 상황이 발생하지 않도록하고 싶었다. – IanR

1

당신은 실제로 당신의 방법 문서에 직접 유형 선언을 설정할 수 있습니다 당신이 여러 장소에서 사용하는 개체 유형에 대한 @typedef를 사용

/** 
* @param {{x:number, y:number}} pointLike 
*/ 
var myFn = function(pointLike) { 
return pointLike.x + ':' + pointLike.y; 
} 

alert(myFn({x:34, y:20})) 
alert(myFn({x:34, y:'20'})) // will trigger compile time type warning 

장점을 유용성/선명도에서 더 많은입니다.

예 : 어쩌면 곧 'Point.z'attr을 얻을 수 있습니다. typedef를 사용하면 전체 코드베이스의 각 인라인 타입 선언이 아닌 typedef 선언 만 업데이트하면됩니다.

는 컴파일러는 코뿔소의 위에 구축도 Using Google Closure's @typedef tag

관련 문제