TypeScript原始类型与含unique symbol对象交叉对应的JS特性是什么
对应功能:JavaScript 原始类型自动装箱(自动包装)机制
你给出的 TypeScript 代码是典型的「烙印类型(Branded Type)」实现,作用是给基础原始类型附加唯一的类型标识,实现编译期的名义类型校验,避免业务语义不同但基础类型相同的值被错误混用(比如示例中同为数字类型的欧元余额和美元余额不允许互相赋值)。
这个 TypeScript 能力完全是兼容 JavaScript 原生特性设计的,对应 JS 的底层逻辑如下:
- JS 中的
number、string、boolean、symbol、bigint都属于原始类型,本身不是对象,没有属性和方法。 - 但 JS 允许对原始值执行类对象操作,比如直接调用
100..toFixed(2)、'test'.length,执行这类操作时,JS 会自动将原始值临时封装为对应的内置包装类实例(数字对应Number实例、字符串对应String实例),操作完成后立即销毁这个临时对象,这个机制就叫做原始类型自动装箱。
TypeScript 正是基于 JS 的这个特性,才允许将原始类型和对象结构做交叉运算:你用 unique symbol 作为键的对象结构,相当于给原始类型加了一个仅编译期可见的唯一标签,运行时不会产生额外代码,也不会和原生属性、自定义属性产生命名冲突。
内容的提问来源于stack exchange,提问作者Alexander Pankin
相关产品推荐
相关产品推荐

