我需要在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'
我做错了什么?
2条答案
按热度按时间taor4pac1#
这种行为的答案在文档中(因为大多数事情都是:p):
为了能够将符号视为唯一文字,可以使用特殊类型
unique symbol
。unique symbol
是symbol
的子类型,只能通过调用Symbol()
或Symbol.for()
或显式类型注解生成。此类型只允许在const声明和只读静态属性上使用,并且 * 为了引用特定的唯一符号,您必须使用typeof运算符 *。不幸的是,这是不可能实现你正在寻找的。尝试将符号提取到它自己的
const
声明中会产生不同的错误:我猜这是因为
id
的unique symbol
类型是唯一的,它不能分配给MyInterface
期望的unique symbol
类型。这似乎是唯一符号的预期行为。请参阅ms/TS#23388,您的问题的精确副本。操场
当然,我可能会被证明是错的,也许有一个方法你可以得到这个工作。
7lrncoxx2#
要使用
unique symbol
作为属性,需要它没有字符串字面量的差异