Closure编译器警告来自extern的undefined属性

时间:2014-03-26 01:22:19

标签: javascript google-closure-compiler angular-translate

关于编译器的一个警告,关于一个未在extern上定义的属性,只要我可以告诉该属性是在该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);

我对于angular-translate的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);

我认为extern文件中不需要goog.provide()和goog.exportProperty()调用。我已经在文件中测试了有没有它们,但它们似乎没有任何区别。

我正在使用grunt-closure-compiler grunt helper运行闭包。

更改为warning_level = QUIET会消除警告,但它也会消除有关可能出现问题的警告。例如,如果我将调用更改为:

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

我想收到警告,因为$ translate对象上没有instatn()函数。

在这种情况下,我需要更改什么才能让闭包编译器找到正确的extern函数?

1 个答案:

答案 0 :(得分:2)

我试试这个:

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

(把@type {Object})。

  

&#34;警告 - 物业瞬间从未定义过   。pascalprecht.translate $翻译&#34;

没有显示更多。