如何在TypeScript中使用unique symbol作为对象属性?

mitkmikd  于 2023-10-22  发布在  TypeScript
关注(0)|答案(2)|浏览(182)

我需要在TypeScript中使用unique symbol,以便能够动态地组成对象文字。如果我使用常规的symbol,我会得到这个错误:
接口中的计算属性名称必须引用类型为文字类型或“唯一符号”类型的表达式。
但是,我不确定如何使用unique symbol作为对象属性。

const bar: unique symbol = Symbol("bar"); // This is fine

interface MyInterface {
    readonly id: unique symbol;
}

const foo: MyInterface = {
    id: Symbol("id"),
};

// Error: Type 'symbol' is not assignable to type 'unique symbol'

我做错了什么?

taor4pac

taor4pac1#

这种行为的答案在文档中(因为大多数事情都是:p):
为了能够将符号视为唯一文字,可以使用特殊类型unique symbolunique symbolsymbol的子类型,只能通过调用Symbol()Symbol.for()或显式类型注解生成。此类型只允许在const声明和只读静态属性上使用,并且 * 为了引用特定的唯一符号,您必须使用typeof运算符 *。
不幸的是,这是不可能实现你正在寻找的。尝试将符号提取到它自己的const声明中会产生不同的错误:

const id: unique symbol = Symbol("id");

const foo: MyInterface = {
    id,
//  ~~
// Type 'typeof id' is not assignable to type 'typeof foo.id'.(2322)
};

我猜这是因为idunique symbol类型是唯一的,它不能分配给MyInterface期望的unique symbol类型。这似乎是唯一符号的预期行为。请参阅ms/TS#23388,您的问题的精确副本。
操场
当然,我可能会被证明是错的,也许有一个方法你可以得到这个工作。

7lrncoxx

7lrncoxx2#

要使用unique symbol作为属性,需要

const bar: unique symbol = Symbol("bar"); // This is fine

interface MyInterface {
  readonly [bar]: 123;
}

const foo: MyInterface = {
  [bar]: 123
}

它没有字符串字面量的差异

interface MyInterface {
  readonly "bar": 123;
}

const foo: MyInterface = {
  "bar": 123
}

相关问题