gpt4 book ai didi

javascript - 如何为此类定义 Google Closure Compiler externs

转载 作者:行者123 更新时间:2023-12-04 13:27:55 26 4
gpt4 key购买 nike

我有以下 JavaScript 类定义,它可以正常工作,并且我使用 Google Closure Compiler 进行编译:

class State {
constructor(x, y, z, rotationX, rotationY) {
this.x = x;
this.y = y;
this.z = z;
this.rotationX = rotationX;
this.rotationY = rotationY;
}

set matrix(value) {
// Magic
}

get matrix() {
// More magic
}

set red(value) {
this.setAttribute(attributeRed, value)
}

get red() {
return this.getAttribute(attributeRed);;
}

static fromUrlSearchParams(searchParams) {
return new State(parseInt (searchParams.get("x"), 10),
parseInt (searchParams.get("y"), 10),
parseInt (searchParams.get("z"), 10),
parseFloat(searchParams.get("rotationX")),
parseFloat(searchParams.get("rotationY")));
}

toUrlSearchParams() {
let searchParams = new URLSearchParams();
searchParams.set("x", this.red);
searchParams.set("y", this.green);
searchParams.set("z", this.blue);
searchParams.set("rotationX", this.pitch);
searchParams.set("rotationY", this.yaw);
return searchParams;
}
}
这种类型是我代码的公共(public)接口(interface)的一部分,这意味着我必须阻止闭包编译器重命名它的符号。我正在编写使用 --externs 传递给闭包编译器的外部文件。转变。这是我到目前为止所拥有的:
State = class {
/**
* @constructor
* @param {number} x
* @param {number} y
* @param {number} z
* @param {number} rotationX
* @param {number} rotationY
*/
constructor(x, y, z, rotationX, rotationY) {
/** @type {number} */
this.x = x;
/** @type {number} */
this.y = y;
/** @type {number} */
this.z = z;
/** @type {number} */
this.rotationX = rotationX;
/** @type {number} */
this.rotationY = rotationY;
}

// Insert property export here. If you just knew how...

/** @return {State} */
static fromUrlSearchParams(searchParams) {}

/** @return {URLSearchParams} */
toUrlSearchParams() {}
};
我在完成该 externs 文件时遇到了三个问题:
  • 构造函数的参数( xyzrotationXrotationY )被重命名。我需要做些什么来防止这种情况发生?
  • static方法 fromUrlSearchParams(searchParams)被编译器删除,因为它得出的结论是它是死代码,因为它没有在编译代码内部使用。我如何导出 static方法?
  • 我如何标记 matrix属性成为公共(public)接口(interface)的一部分?

  • 编辑:
    在花了几个小时解决这个问题后,阅读了我能找到的所有文档,在 GitHub 上爬取文件,测试各种在线 externs 生成器并获得了《Closure - The Definitive Guide》一书的副本,但问题仍未解决。
    Closure Compiler 文档已经存在十多年了,除了最基本的示例之外,它对所有内容仍然毫无用处。你一定是在开玩笑吧。
    这是我到目前为止尝试过的:
    class State {
    /**
    * @constructor
    * @param {number} x
    * @param {number} y
    * @param {number} z
    * @param {number} rotationX
    * @param {number} rotationY
    */
    constructor(x, y, z, rotationX, rotationY) {
    /** @type {number} */
    this.x = x;
    /** @type {number} */
    this.y = y;
    /** @type {number} */
    this.z = z;
    /** @type {number} */
    this.rotationX = rotationX;
    /** @type {number} */
    this.rotationY = rotationY;
    }

    /**
    * @nocollapse
    * @param {URLSearchParams} searchParams
    * @return {State}
    */
    static fromUrlSearchParams(searchParams) {}

    /** @return {URLSearchParams} */
    toUrlSearchParams() {}
    };
    与原始文件的区别在于使用 class State {而不是 State = class { .有趣的是,这会导致以下错误消息:
    ERROR - [JSC_BLOCK_SCOPED_DECL_MULTIPLY_DECLARED_ERROR] Duplicate let / const / class / function declaration in the same scope is not allowed.
    不知道为什么这会有所作为,但无论如何,让我们继续前进。下一次尝试:
    /**
    * @constructor
    * @param {number} x
    * @param {number} y
    * @param {number} z
    * @param {number} rotationX
    * @param {number} rotationX
    */
    var State = {};

    /** @type {number} */
    State.prototype.x;

    /** @type {number} */
    State.prototype.y;

    /** @type {number} */
    State.prototype.z;

    /** @type {number} */
    State.prototype.rotationX;

    /** @type {number} */
    State.prototype.rotationX;

    /**
    * @nocollapse
    * @param {URLSearchParams} searchParams
    * @return {State}
    */
    State.fromUrlSearchParams = function(searchParams) {};

    /** @return {URLSearchParams} */
    State.prototype.toUrlSearchParams = function() {};
    使用该代码运行它会导致
    ERROR - [JSC_VAR_MULTIPLY_DECLARED_ERROR] Variable ColorCubeState declared more than once. First occurrence: blabla.js

    class State {
    ^^^^^
    好吧,我们再来一次。如果我传递源文件和外部文件,为什么编译器会声明它已经定义,这对我来说是个谜。一个定义它,另一个注释它,或者你会这么认为。
    没有任何尝试可以避免静态方法被编译器删除。
    除了使用我的代码构建和调试编译器之外,我看不到任何可以尝试的东西。幸运的是,这个问题有一个有保证的解决方案:只需不使用 Google Closure Compiler。

    最佳答案

    以下工作:
    输入文件:

    "use strict";

    const attributeX = "x";
    const attributeY = "y";
    const attributeZ = "z";
    const attributeRotationX = "rotationX"
    const attributeRotationY = "rotationY";

    /** @implements {StateInterface} */
    globalThis["State"] = class {
    constructor(x, y, z, rotationX, rotationY) {
    this.x = x;
    this.y = y;
    this.z = z;
    this.rotationX = rotationX;
    this.rotationY = rotationY;
    }

    /**
    * @nocollapse
    * @suppress {checkTypes}
    */
    static "fromUrlSearchParams"(searchParams) {
    return new globalThis["State"](parseInt (searchParams.get(attributeX), 10),
    parseInt (searchParams.get(attributeY), 10),
    parseInt (searchParams.get(attributeZ), 10),
    parseFloat(searchParams.get(attributeRotationX)),
    parseFloat(searchParams.get(attributeRotationY)));
    }

    toUrlSearchParams() {
    let searchParams = new URLSearchParams();
    searchParams.set(attributeX , this.x .toString(10));
    searchParams.set(attributeY , this.y .toString(10));
    searchParams.set(attributeZ , this.z .toString(10));
    searchParams.set(attributeRotationX, this.rotationX.toString(10));
    searchParams.set(attributeRotationY, this.rotationY.toString(10));
    return searchParams;
    }
    }
    外部文件:
    /**
    * @fileoverview
    * @externs
    */

    /** @interface */
    class StateInterface {
    /**
    * @param {number} x
    * @param {number} y
    * @param {number} z
    * @param {number} rotationX
    * @param {number} rotationY
    */
    constructor(x, y, z, rotationX, rotationY) {
    /** @type {number} */
    this.x = x;
    /** @type {number} */
    this.y = y;
    /** @type {number} */
    this.z = z;
    /** @type {number} */
    this.rotationX = rotationX;
    /** @type {number} */
    this.rotationY = rotationY;
    }

    /**
    * @param {URLSearchParams} searchParams
    * @return {StateInterface}
    */
    static fromUrlSearchParams(searchParams) {}

    /** @return {URLSearchParams} */
    toUrlSearchParams() {}
    };

    关于javascript - 如何为此类定义 Google Closure Compiler externs,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67064898/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com