2013-06-06 1 views
2

함수의 반환 형식이 함수의 자체 범위 내에서 정의 된 경우이 함수의 반환 형식을 표시하려고합니다. 나는이 here를 컴파일 할 때클로저 컴파일러에서 로컬 형식 노출

// ==ClosureCompiler== 
// @compilation_level ADVANCED_OPTIMIZATIONS 
// ==/ClosureCompiler== 

/** @return {MyType} */ 
function func(){ 
    /** @constructor */ 
    function MyType(){} 

    return new MyType(); 
} 

/** @type {MyType} */ 
var instance = func(); 

, 나는 두 가지 유형 오류 상기 @return 주석 다른 하나는 @type 주석에 대한 하나를 얻을. 두 오류 모두 Unknown type MyType이라고 표시합니다. 이 패턴을 형식 검사로 컴파일 할 수있는 방법이 있습니까?

답변

0

instance (새 MyType() 또는 instance instanceof MyType을 수행 할 수 없음)을 만들 때 MyType 유형을 사용할 수 없기 때문에 유형을 찾을 수없는 경우 일 수 있습니다.

인스턴스와 동일한 범위에 typedef를 추가하거나 MyType과 동일한 범위에서 인스턴스를 생성하면이 문제를 해결할 수 있습니다.

모두 :

/** @typedef {Object} */ 
var MyType; 
/** @return {MyType} Returns new MyType **/ 
function func(){ 
    /** @constructor */ 
    function MyType(){ 
    } 
    return new MyType(); 
} 
/** @type {MyType} */ 
var instance = func(); 

과 :

function func(){ 
    /** @constructor */ 
    function MyType(){ 
    } 
    /** @type {MyType} */ 
    var instance = new MyType(); 
    return new MyType(); 
} 

경고를 생성하지 않음

[업데이트]

는 주석을 통해 복잡한 유형을 제공하기 위해하는 것입니다 고통스럽게 힘들어. 유형을 원하는만큼 복잡하게 만들 수 있습니다. externs를 사용하면 externs 변수와 함수의 이름이 더 짧은 이름으로 바뀌지 않고 (일부 추가 컴파일 매개 변수없이) 이름을 다시 정의 할 수 없으므로 작동하지 않습니다. 그래서 난 당신이 기본적으로 형식 정의 주석을 제공 붙어있어 같아요

/** @typedef {{hands:number,doSomething:function(string):boolean}} */ 
var MyType; 
/** @return {MyType} Returns new MyType **/ 
function func(){ 
    /** @constructor */ 
    function MyType(){ 
    this.hands=22; 
    } 
    MyType.prototype.doSomething=function(msg){ 
    return true; 
    } 
    return new MyType(); 
} 
/** @type {MyType} */ 
var instance = func(); 
/** @type string */ 
var myString=instance.hands;//warning:found number required string 
/** @type Array */ 
var myArray=instance.doSomething("hi");//found boolean required Array 

instance.doSomething(22);//found number required string 
instance.doSomething();//at leas 1 argument(s) 
+0

안녕하세요. HMR이 왜 그런 유형을 찾을 수 없는지에 대한 올바른 이유라고 생각합니다. 첫 번째 솔루션은 내가 뭘했는지에 가깝지만 함수에서 Object의 인스턴스 인 모든 유형을 허용하며 인스턴스의 MyType 만 받아들이는 방법을 찾기를 희망했습니다. (IE.''function func() {return {};}'은 에러없이 컴파일하지만, 타입 검사 에러가 있기를 원합니다) – Paulpro

+0

그 바깥 쪽 범위에서 런타임시에'instance instanceof myType은 해당 범위에 없기 때문에 MyType입니다. 하지만 컴파일 시간에 정렬 될 수 있기를 바랬습니다. – Paulpro

+0

@ Paululpro 제 생각에 JS가 타입을 찾지 못하면 컴파일러는 타입을 찾을 수 없지만 컴파일러가 어떻게 그것을하는지는 모르겠습니다. 내 대답을 업데이 트하고 그것을 정의하는'type' 주석을 사용하여 붙어 있다고 생각합니다. 원하는만큼 복잡 할 수는 있지만 여러 줄로 확산시킬 수 있다면 좋을 것입니다. 그렇게 할 방법을 찾지 못했습니다. – HMR

0

문제는 "합니다 MyType"가 "FUNC"로 범위가 있다는 것입니다 외부 사용할 수 없습니다. 전역 범위에서 @interface를 정의하고 정의 함수 밖에서 해당 유형을 사용하는 것이 더 효과적 일 수 있습니다.