2013-08-12 1 views
3

나는 @param {window.MyNamespace.MyEnum} myVar 같은 일을했지만, 컴파일러는 JSC_TYPE_PARSE_ERROR: Bad type annotation. Unknown type window.MyNamespace.MyEnum에 대해 불평했다.Google Closure Compiler에서 유형으로 enum을 사용하는 방법이 있습니까?

enum이 @enum {number} 인 경우 @typedef을 열거 형으로 설정해야합니까? 아니면 @param {number} 만 사용해야합니까? 나는 다른 값들이 실제로 허용되지 않기 때문에 enum 것을 선호한다.

(function (MyNamespace) { 
    /** 
    * @enum {number} 
    */ 
    MyNamespace.MyEnum = { 
    FOO: 1, 
    BAR: 2, 
    BAZ: 3 
    } 
    /** 
    * @constructor 
    * @param {Object} foo 
    */ 
    MyNamespace.MyClass = function (foo) { 
    this.foo = foo 
    } 
    /** 
    * @constructor 
    * @param {MyNamespace.MyClass} bar 
    */ 
    MyNamespace.MyOtherClass = function (bar) { 
    this.bar = bar 
    } 
    /** 
    * @param {MyNamespace.MyEnum} baz 
    */ 
    MyNamespace.MyOtherClass.prototype.someMethod = function (baz) { 
    } 
})(window.MyNamespace = window.MyNamespace || {}) 
+0

'window' 네임 스페이스를 정의하지 않은 한'window'는 형식 선언의 일부가 아니어야합니다. JQuery와 기업 문서에서 작성된 –

+0

내가 네임 스페이스를 정의했다 : [링크] (http://enterprisejquery.com/2010/10/how-good-c-habits-can-encourage-bad-javascript-habits-part- 1 /)하지만 클로저 컴파일러는 유형을 찾을 수 없으므로 네임 스페이스 정의의 인수 부분을 함수로 옮겼습니다. – Aeveus

+0

게시 한 코드에 오류가 있습니까? –

답변

4

클로저 컴파일러에서는 함수 매개 변수를 사용하는 앨리어싱 유형이 제대로 지원되지 않습니다. 컴파일 후 코드를 인클로저에 넣으려면 --output_wrapper 플래그를 사용하십시오. 다음 코드는 올바르게 컴파일됩니다 :

+0

좋아요, 올바르게 컴파일되지만 매개 변수 유형 검사는 다른 enu가 아닌 enum 유형으로 제한됩니다. m 값. MyNameSpace.MyOtherClass.someMethod (4)를 호출하면 4가 열거 형에서 정의 된 값이 아니더라도 경고를 표시하지 않습니다 ...하지만 어쩌면 저는 그것에 대해 너무 엄격합니다. – Sebastien

+0

@Sebastien Enums는 그 방법으로 사용하도록 검증되거나 의도되지 않았습니다. 'MyNamespace.MyEnum.BAR' 기호를 사용하기위한 것이고 컴파일러는 그것을 컴파일하는 동안 값으로 대체 할 것입니다. –

+0

그래도 매개 변수 유형을 "MyNamespace.MyEnum"으로 지정 했더라도이 메서드를 숫자로 호출하면 경고를 표시하지 않습니다 (하지만 글쎄, 그 중 하나에 대한 해결책을 찾지 못했습니다. ...) – Sebastien