【问题标题】:how can I use goog.provide and @externs at the same time?如何同时使用 goog.provide 和 @externs?
【发布时间】:2018-03-22 23:44:10
【问题描述】:

我试图通过解决缩小问题来稍微简化我们的代码,这些问题往往使我们使用oVar["stuff"]["things"] 而不是oVar.stuff.things 之类的东西

我在使用@externs 注释同时使用goog.provide 时遇到了问题。如果我手动将新文件作为 --externs 传递,或者我使用 @externs 并将新文件作为 --js 传递,我已经让我的班级按照我想要的方式工作。这两种解决方案的问题在于,我必须为我创建的每个“外部”类添加 --externs 或 --js。

一旦我尝试在类文件中添加 goog.provide 或 goog.module(即使没有使用 goog.require 加载文件),我工作的所有 externs 选项都会停止工作。澄清一下,在这种情况下使用 goog.require 根本没有帮助。

我添加了一些伪代码来模仿我正在做的事情。基本上,我有一个函数,实现者可以使用不需要缩小任何参数的对象调用该函数。

这是我要在类文件中执行的操作:

/**
 * @fileoverview
 * @externs
 */

goog.provide("common.classes.newClass");
/**
 *
 * @constructor
 */
common.classes.newClass = function() {};

/**
 * @typedef {*}
 */
common.classes.newClass.prototype.var1;
/**
 * @typedef {*}
 */
common.classes.newClass.prototype.var2;

这是我尝试在另一个文件中使用它的方式:

goog.provide("app.namespace");

goog.require("common.classes.newClass");

/**
 * @param {common.classes.newClass} parameter
 * @exports
 */
app.namespace.init = function(parameter)
{
    // do stuff

    /**
     * @type {common.classes.newClass}
     */
    this.passedObject = parameter;

    // do other stuff

    otherFunction(this.passedObject.var1);
};

我遇到的问题是,除非我使用 this.passedObject['var1'],否则 'var1' 键会被缩小。

【问题讨论】:

    标签: javascript google-closure-compiler google-closure-library


    【解决方案1】:

    你不能。这些是两个完全独立的东西。您也不要导入外部或使用goog.require 引用它。外部是全球性的。

    要在 extern 中声明命名空间,只需使用:

    const common = {};
    /** @const */ common.classes = {};
    

    【讨论】:

    • 这是有道理的。我主要是尽量避免对我拥有的每个外部外部使用 --externs,因为我们使用的是 calcdeps.py,并且它不接受外部目录(java 编译器也不接受,iirc)。不过,我只是想出了如何做到这一点!如果我将@externs 设置在我们所有类的顶部,并将类目录作为-i 传递给calcdeps.py,这就是我想要它做的一切!
    • 可以使用通配符匹配:--externs path/to/folder/**.js
    猜你喜欢
    • 2010-12-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-13
    相关资源
    最近更新 更多