如何在TypeScript中使用unique symbol作为对象属性?
TypeScript中unique symbol作为对象属性的正确用法
首先得明确:unique symbol是TypeScript的单例类型,每个声明为unique symbol的变量都是独一无二的,普通Symbol()创建的值是通用symbol类型,和unique symbol不兼容——这就是你代码报错的核心原因。
你写的interface MyInterface { readonly id: unique symbol; },是要求id属性的值是某个特定的unique symbol实例,但你赋值的Symbol("id")只是普通symbol,类型自然不匹配。
正确使用方式分两种场景:
1. 用unique symbol作为属性名(解决你提到的“计算属性名称”错误)
先声明一个unique symbol常量,再通过计算属性语法在接口里定义:
const bar: unique symbol = Symbol("bar"); interface MyInterface { [bar]: string; // 以unique symbol作为计算属性名 } const foo: MyInterface = { [bar]: "hello", };
2. 用unique symbol作为属性值的类型
先声明具体的unique symbol常量,再在接口里引用它的类型:
// 声明唯一的symbol常量 const idSymbol: unique symbol = Symbol("id"); // 接口指定id属性为这个特定的unique symbol类型 interface MyInterface { readonly id: typeof idSymbol; } // 赋值时必须使用这个特定的symbol const foo: MyInterface = { id: idSymbol, };
为什么不能直接在接口里写id: unique symbol?因为unique symbol不能单独作为属性类型使用,它必须绑定到具体的常量实例——TypeScript不允许用“任意unique symbol”来定义属性类型,必须明确指定是哪一个。另外要注意:unique symbol只能用const声明,用let/var会直接报错。
内容的提问来源于stack exchange,提问作者Robo Robok
相关产品推荐
相关产品推荐

