TypeScript如何从结构上定义原始类型?联合类型赋值报错解惑
一、原始类型的结构定义方式
TypeScript作为结构类型系统,对string、number这类原始类型的结构描述,依赖内置的全局接口实现。
TypeScript在全局作用域中声明了String、Number、Boolean等内置接口,这些接口完整定义了对应原始类型值可访问的所有方法和属性——比如String接口包含charAt、concat、slice等方法,Number接口包含toExponential、valueOf、toFixed等方法。
当你使用原始类型值时,TypeScript会自动将其与对应的内置接口做结构匹配:比如string类型变量调用方法时会被隐式装箱为String对象,TypeScript便基于String接口的结构做类型检查,确保调用的方法合法。
简言之,原始类型的“结构”就是其对应内置接口描述的方法与属性集合,TypeScript通过这些接口完成对原始类型的结构校验。
二、联合字面量类型赋值报错的原因
先看你给出的报错代码:
type AB = 'A' | 'B'; const c: AB = 'C'; // Type '"C"' is not assignable to type 'AB'.
这个报错本质并非'C'缺少属性,而是字符串字面量类型的“结构”就是它的具体值。
在TypeScript中,字符串、数字、布尔这类字面量类型是结构类型系统的特殊情况:它们的类型标识直接绑定到具体原始值,而非属性集合。'A'和'B'的“结构”就是各自的字符串值,'C'的字符串值与两者均不匹配,因此无法赋值给AB类型。
换个角度理解:对于字面量联合类型,TypeScript的结构校验是值的相等性校验——这些原始值没有独有的可枚举属性(原型方法是同类型所有值共享的,无法区分不同字面量),所以判断匹配的唯一标准就是值本身是否属于联合类型的成员。
内容的提问来源于stack exchange,提问作者Ilya Loskutov

