Компилятор Closure предупреждает о неопределенном свойстве из extern

Компилятор закрытия выдает предупреждение о свойстве, которое не определено во внешнем компоненте, хотя, насколько я могу судить, свойство определено в этом внешнем компоненте.

Я хотел бы, чтобы компилятор закрытия скомпилировал это без выдачи этого предупреждения.

Я использую следующие параметры компилятора:

  • angular_pass
  • компиляция_уровень = РАСШИРЕННАЯ_ОПТИМИЗАЦИЯ
  • create_source_map
  • language_in=ECMASCRIPT5_STRICT
  • manage_close_dependencies
  • warning_level = ПОДРОБНО

Выдается предупреждение:

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

Мой внешний вид для углового перевода содержит следующее:

/**
 * @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() требуются во внешнем файле. Я тестировал с ними и без них в файле, но они, похоже, не имеют никакого значения.

Я запускаю закрытие, используя помощник grunt-close-compiler grunt.

Изменение на warning_level=QUIET устраняет предупреждение, но также устраняет предупреждения о вещах, которые могут быть проблемой. Например, если я изменю вызов на это:

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

Я хотел бы получить предупреждение, потому что в объекте $translate нет функции instatn().

Что мне нужно изменить, чтобы заставить компилятор закрытия найти правильную внешнюю функцию в этом случае?


person garethm    schedule 26.03.2014    source источник
comment
Вы тестировали с warning_level=QUIET?   -  person gabrieloliveira    schedule 26.03.2014
comment
warning_level=QUIET устраняет предупреждение, однако, если я напишу функцию с ошибкой, instatn warning_level=QUIET не жалуется. Я хотел бы сохранить предупреждения о действительных проблемах с кодом.   -  person garethm    schedule 26.03.2014
comment
Теперь я понимаю. Вы не можете определить это свойство перед загрузкой значения из внешнего js? Это не совсем правильно, но я считаю, чем работать.   -  person gabrieloliveira    schedule 26.03.2014
comment
Насколько я знаю, компилятор замыкания загружает символы из внешних модулей перед обработкой вашего кода. Я попытался добавить goog.require('pascalprecht.translate.$translate'); в to служебного файла, но это приводит к сбою компиляции с ошибкой "ОШИБКА - требуется пространство имен pascalprecht.translate.$translate никогда не предоставлялось"   -  person garethm    schedule 26.03.2014
comment
Я также попытался добавить источник angular-translate к тому, что я подаю компилятору закрытия, но этот источник содержит теги JSDoc, которые несовместимы с закрытием, что приводит к сбою всей компиляции.   -  person garethm    schedule 26.03.2014
comment
Я пытаюсь найти, почему компилятор закрытия запускает это предупреждение, но я действительно не понимаю   -  person gabrieloliveira    schedule 26.03.2014


Ответы (1)


Я пробую это:

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

(поместите @type {Объект}). И

"ВНИМАНИЕ! Мгновенное свойство никогда не определялось в pascalprecht.translate.$translate"

больше не показывать.

person gabrieloliveira    schedule 26.03.2014
comment
Мне также нужно было изменить аннотации для trFilter(), чтобы @param {Object} $translate. Удивительно, но изменение обоих на Object приводит к возникновению ошибок при использовании неправильного имени функции. Спасибо за помощь. - person garethm; 26.03.2014