【问题标题】:Closure compiler warns about undefined property from extern闭包编译器警告来自外部的未定义属性
【发布时间】:2014-03-26 01:22:18
【问题描述】:

闭包编译器对未在外部定义的属性发出警告,据我所知,该属性是在外部定义的。

我想让闭包编译器干净地编译它而不发出这个警告。

我正在为编译器使用以下选项:

  • 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);

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

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

更改为 warning_level=QUIET 确实消除了警告,但它也消除了有关可能成为问题的事情的警告。例如,如果我将调用更改为:

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

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

在这种情况下,我需要进行哪些更改才能让闭包编译器找到正确的外部函数?

【问题讨论】:

  • 您使用 warning_level=QUIET 进行了测试?
  • warning_level=QUIET 确实消除了警告,但是如果我将函数拼错为 instatn warning_level=QUIET 不会抱怨。我想保留有关代码有效问题的警告。
  • 我现在明白了。您不能在从外部 js 加载值之前定义此属性吗?这不太正确,但我相信比工作。
  • 据我所知,闭包编译器会在处理您的代码之前从外部加载符号。我确实尝试添加 goog.require('pascalprecht.translate.$translate');到服务文件的 to,但这会导致编译失败并出现错误“错误 - 从未提供所需的“pascalprecht.translate.$translate”命名空间”
  • 我也尝试将 angular-translate 源添加到我提供给闭包编译器的内容中,但是该源包含与闭包不兼容的 JSDoc 标签,这会导致整个编译失败。

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


【解决方案1】:

我试试这个:

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

(输入@type {Object})。还有

"警告 - 属性瞬间从未定义 pascalprecht.translate.$translate"

不再显示。

【讨论】:

  • 我还需要将 trFilter() 的注释更改为“@param {Object} $translate”。令人惊讶的是,将两者都更改为 Object 会在使用错误的函数名称时产生错误。谢谢你的帮助。
猜你喜欢
  • 2014-04-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-04-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-05-15
相关资源
最近更新 更多