TypeScript 在constAssert中,符号应被视为唯一,

djmepvbi  于 4个月前  发布在  TypeScript
关注(0)|答案(5)|浏览(95)

TypeScript版本: 3.8.0-dev.20191205
搜索词:

  • const assertion unique symbol
  • "unique symbol" "as const"
    代码
const prop = Symbol()
const dictionary = {
  prop: Symbol()
}
const sealedDictionary = {
  prop: Symbol()
} as const

class MyClass {
  // Works because "prop" is a unique symbol
  [prop]: 1

  // Does not work because "dictionary.prop" is not a unique symbol
  [dictionary.prop]: 2

  // Does not work because "sealedDictionary.prop" is not a unique symbol,
  // even though it probably should be?
  [sealedDictionary.prop]: 3
}

预期行为:

MyClass 应该接受 sealedDictionary.prop 作为计算属性名,因为它应该被视为一个唯一符号。

实际行为:

TypeScript使用TS1166报错:
类属性声明中的计算属性名必须引用类型为字面类型或'unique symbol'类型的表达式。

**Playground链接:**提供更新(旧链接在新playground中似乎已损坏)
相关问题:

efzxgjgh

efzxgjgh1#

符号在分配给对象时似乎失去了“独特性”。
这种行为的另一个例子:Playground。

apeeds0o

apeeds0o2#

@RyanCavanaugh 你将这个问题标记为“等待更多反馈”。你能详细说明一下这是什么意思吗?你是在寻找社区反馈还是维护者反馈?
我之前也遇到过这个问题,一度认为是TypeScript符号索引支持的问题,直到有人指出这里。如果能解决这个问题就太好了。

1u4esq0p

1u4esq0p3#

当前的行为是有意为之还是疏忽?创建具有唯一符号的对象需要这样做,这令人沮丧:

const a = Symbol();
const b = Symbol();
const symbols = { a, b } as const;

如果可以直接声明符号,那就更好了:

const symbols = {
  a: Symbol(),
  b: Symbol()
} as const;
oipij1gg

oipij1gg4#

有任何更新吗?
我也遇到了相同的奇怪行为。另外,就我的情况而言,我不想让类型有 readonly ,所以我在寻找另一种创建对象的方法。

tv6aics1

tv6aics15#

现在编写这样的代码非常不方便。我必须这样做:

const fooSymbols = {
  a: Symbol(),
  b: Symbol()
} as {
  readonly a: unique symbol
  readonly b: unique symbol
}

但是关于这个问题的确有一些需要考虑的事情,比如 [[Getter]] :

const _b = Symbol()
const fooSymbols = {
  get a() {
    return Symbol()
  },
  get b() {
    return _b
  }
} as const

是否有可能不处理与 [[Getter]] 对应的属性,而是处理 expression 的属性?
处理指的是通过 as const 将相应的 symbol 转换为 unique symbol

相关问题