2014-03-26 40 views
0

閉包編譯器警告有關在extern上未定義的屬性,只要我可以告訴屬性在該extern上定義。Closure編譯器對來自extern的未定義屬性發出警告

我想得到封閉編譯器乾淨地編譯這個沒有發出這個警告。

我使用編譯器下列選項:

  • angular_pass
  • compilation_level = ADVANCED_OPTIMIZATIONS
  • create_source_map
  • language_in = ECMASCRIPT5_STRICT
  • manage_closure_dependencies
  • warning_level = VERBOSE

所產生的警告是:

trFilter.js:19: WARNING - Property instant never defined on pascalprecht.translate.$translate 
      target = $translate.instant(texts.toString()); 
        ^

產生該警告具有以下內容的文件:

var myApp = {}; 

/* 
* The trFilter generates translated strings. 
*/ 
(function() { 
    'use strict'; 

    /** 
    * @param {pascalprecht.translate.$translate} $translate 
    * @returns {function((Array.<string>|string)): string} 
    */ 
    var trFilter = function ($translate) { 
    return function(texts) { 
     var target; 
     target = $translate.instant(texts.toString()); 
     return target; 
    }; 
    }; 

    myApp.trFilter = ['$translate', trFilter]; 
})(); 

angular.module('myApp') 
    .filter('tr', myApp.trFilter); 

我給角平移的extern包含以下內容:

/** 
* @fileoverview Externs for Angular Translate. 
* @externs 
*/ 

/** 
* Base namespace 
* @type {Object} 
* @const 
*/ 
var pascalprecht = {}; 
goog.provide('pascalprecht'); 

/** 
* angular-translate namespace 
* @type {Object} 
* @const 
*/ 
pascalprecht.translate = {}; 
goog.provide('pascalprecht.translate'); 

/** 
* The $translate service 
* @constructor 
*/ 
pascalprecht.translate.$translate; 
goog.provide('pascalprecht.translate.$translate'); 

/** 
* Returns a translation instantly from the internal state of loaded translation. All rules 
* regarding the current language, the preferred language of even fallback languages will be 
* used except any promise handling. If a language was not found, an asynchronous loading 
* will be invoked in the background. 
* 
* @param {string} translationId Translation ID 
* @param {Object=} interpolateParams Params 
* @param {string=} interpolationId 
* 
* @return {string} translation 
*/ 
pascalprecht.translate.$translate.instant = function (translationId, interpolateParams, interpolationId) {}; 
goog.exportProperty(pascalprecht.translate.$translate, 'instant', pascalprecht.translate.$translate.instant); 

我不認爲goog.provide()和goog.exportProperty()調用是需要在外部n文件。我已經在文件中測試了它們,沒有測試它們,但它們似乎沒有任何區別。

我正在使用grunt-closure-compiler grunt helper運行閉包。

更改爲warning_level = QUIET確實消除了警告,但它也消除了有關事情的警告。例如,如果我改變調用此:

target = $translate.instatn(texts.toString(()); 

我想獲得一個警告,因爲在$無instatn()函數翻譯對象。

在這種情況下,我需要更改以獲取閉包編譯器以找到正確的extern函數?

+0

您使用warning_level = QUIET測試了嗎? – gabrieloliveira

+0

warning_level = QUIET確實消除了警告,但是如果我拼錯函數instatn warning_level = QUIET不會抱怨。我想保留有關代碼有效問題的警告。 – garethm

+0

我現在明白了。在從外部js加載值之前,您無法定義此屬性?這是不正確的,但我相信不是工作。 – gabrieloliveira

回答

2

我試試這個:

/** 
* The $translate service 
* @type {Object} 
* @constructor 
*/ 
pascalprecht.translate.$translate; 
goog.provide('pascalprecht.translate.$translate'); 

(把@type {對象})。而

「警告 - 物業即時從不 pascalprecht.translate定義$翻譯。」

沒有表現出更多的。

+0

我還需要更改trFilter()的註釋以使其具有「@param {Object} $ translate」。令人驚訝的是,將兩者都更改爲Object時,會在使用錯誤的函數名稱時產生錯誤。感謝您的幫助。 – garethm