TypeScript 建议:将生成的枚举类型的赋值方向翻转,以节省一些位,

yshpjwxd  于 4个月前  发布在  TypeScript
关注(0)|答案(8)|浏览(53)

搜索词

enum assignment

建议

交换赋值顺序

用例

枚举类型

示例

enum Action {
  foo
  bar
  baz
  thequickbrownfoxjumpsoverthelazydog
}

当前生成:

"use strict";
var Action;
(function (Action) {
    Action[Action["foo"] = 0] = "foo";
    Action[Action["bar"] = 1] = "bar";
    Action[Action["baz"] = 2] = "baz";
    Action[Action["thequickbrownfoxjumpsoverthelazydog"] = 3] = "thequickbrownfoxjumpsoverthelazydog";
})(Action || (Action = {}));

建议改为:

"use strict";
var Action;
(function (Action) {
    Action[Action[0] = "foo"] = 0;
    Action[Action[1] = "bar"] = 1;
    Action[Action[2] = "baz"] = 2;
    Action[Action[3] = "thequickbrownfoxjumpsoverthelazydog"] = 3;
})(Action || (Action = {}));

检查清单

我的建议满足以下准则:

  • 这不会对现有的TypeScript/JavaScript代码造成破坏性改变
  • 这不会改变现有JavaScript代码的运行时行为
  • 这可以在不根据表达式的类型发出不同的JS的情况下实现
  • 这不是一个运行时特性(例如库功能,带有JavaScript输出的非ECMAScript语法等)
  • 这个特性将与 TypeScript's Design Goals 的其他部分保持一致。
ppcbkaq5

ppcbkaq52#

#19848被标记为#2655的重复内容,并自动关闭。#2655是关于关闭编译器和key['A']key.A的讨论。这个问题以及#19848的目的是一个单独的问题。

xxls0lw8

xxls0lw83#

#19848的评论:
我认为你可能误解了,这只是关于TS生成较小的代码,与任何后处理步骤分开。
这是与这里相同的原因(较小的发射)。这是一个重复的问题。#2655只是与之略有关联。
然而,你说得对——另一个问题是锁定的。

p8h8hvxi

p8h8hvxi4#

let c = 0;
const f = () => c++;
enum A {
    B = f(),
    C = f(),
}

交换赋值顺序导致错误行为。
#29838#19848 重复

cwtwac6a

cwtwac6a5#

你不能将枚举键分配给函数调用,所以这不适用,但你最终会调用两次该函数,所以我明白你遇到的问题。我认为编译器仍然可以通过在枚举中进行方法调用时执行类似以下操作来处理这种情况:

let tmp;
Action[Action[tmp = fn()] = "foo"] = tmp;

或者通过实现这两种模式,因为我确信这是一种边缘情况,尽管我在支持多种模式方面确实看到了问题。通过这个更改,我们可以在代码库中节省大约5kb的空间。

jm2pwxwz

jm2pwxwz6#

解:对于非数值字面量的初始化,我们可以按照当前的方式进行;对于数值字面量的初始化,或者没有初始化时,我们可以使用你建议的方式。

js81xvg6

js81xvg67#

根据我所了解的,这应该可以工作。我认为它对于除了方法调用、属性访问器和枚举中其他键的引用(它只是变得复杂)之外的任何内容都可以工作。例如:
我刚刚测试了最后一个,似乎它是安全的:

enum A {
  v = w, // invalid forward reference
  w = thing(),
  x = fn(),
  y = x,
}

生成:

var A;
(function (A) {
    A[A["v"] = 0] = "v";
    A[A["w"] = thing()] = "w";
    A[A["x"] = fn()] = "x";
    A[A["y"] = A.x] = "y";
})(A || (A = {}));
j8yoct9x

j8yoct9x8#

@markkahn取决于有创意的人怎么做 :)

let count = 0;
enum MyEnum {
    A = fn(),
    B = (() => {
        Object.defineProperty(MyEnum, "A", {
            get() {
                count++;
                return count;
            }
        })
        return 5;
    })(),
    C = A,
    D = A
}

是的,好吧...没有人会这样做,但你永远不知道。

相关问题