2

다음 함수는 OK이다 유효 파라미터로 인식되고 여기 data.aRandomKeyWebStorm 6의 클로저 컴파일러 주석, 레코드 유형 사용 방법은 무엇입니까?

/** 
* Test 
* @param {{ aRandomKey: string, anotherKey }} data 
*/ 
function test(data) { 
    console.log(data.aRandomKey); 
} 

.

이제 문제는 다음에있다 : 여기

/** 
* @param { string, function({{ pageId: string }} data) } 
*/ 
socket.on('page:getSource', function (data) { 
    //data = { pageId: id } 
    console.log(data.pageId) 
}) 

, data.pageId은 ... 미해결하고 @param 구문은 잘못된 것입니다. 나는 이러한 상황에 대처 어떻게 ..

socket.on('page:getSource', 
    /** 
    * @param {{ pageId: string }} data 
    */ 
    function (data) { 
     //data = { pageId: id } 
     console.log(data.pageId) 
    } 
) 

그래서 : 동일

은 간다?

+0

해결 방법은 함수를 추출하고 이름을 지정하는 것입니다.하지만 그렇게하지 않아도됩니다. – fusio

답변

1

첫 번째 예제는 콜백 함수가 아니라 socket.on에 잘못 적용됩니다. 또한 주석의 형식이 잘못되었습니다. @param 태그는 정확히 하나의 매개 변수와 유형을 나타냅니다. 당신은 두 가지를 설명하려합니다. 또한 레코드 유형은이를 감싸는 하나의 중괄호 세트 만 필요합니다. -하지만 socket.on 정의가 제공되지 때부터가 확인할 수없는

/** 
* @param {string} eventName, 
* @param {function({ pageId: string })} callback 
*/ 
socket.on = function(eventName, callback) {}; 

socket.on('page:getSource', function (data) { 
    //data = { pageId: id } 
    console.log(data.pageId) 
}); 

두 번째 예는 올바른 것 : 여기에서 볼 수있는 하나의 방법입니다. 다음은 작동하는 유사한 테스트 사례입니다.

// ==ClosureCompiler== 
// @compilation_level ADVANCED_OPTIMIZATIONS 
// @output_file_name default.js 
// @warning_level VERBOSE 
// @formatting pretty_print 
// ==/ClosureCompiler== 

function test2(a, b) { 
    b(a); 
} 

test2({pageId: 17}, 
    /** 
    * @param {{ pageId: string }} data 
    */ 
    function (data) { 
     //data = { pageId: id } 
     console.log(data.pageId) 
    } 
); 
+0

WebStorm의 문제는 두 번째 예제가 제대로 작동하지 않기 때문입니다. 함수의 이름을 지정하면 작동합니다 (예 : '/ ** @param {{pageId : string}} data */var f = function (data) {..}'와'test2 ({pageId : 17}, f)' – fusio