TypeScript中string & {}交叉类型的含义是什么?
string & {} 交叉类型的含义与用途
类型本质
string & {} 和普通的 string 类型完全等价:
- TypeScript 中
{}并非特指「空对象」,而是代表所有非null、非undefined的类型 - 字符串本身满足
{}的类型约束,二者交叉后的有效约束仍为字符串类型,不会对实际类型校验、运行逻辑产生任何额外影响。
写法的核心作用
这个写法的唯一目的是 保留联合类型中字面量值的编辑器智能提示:
如果你直接将类型定义为:
type AriaRole = 'alert' | 'tree' | 'treegrid' | 'treeitem' | string;
TypeScript 会自动把整个联合类型折叠简化为纯 string 类型,前面定义的几个预设字面量会被完全合并掉,你在编辑器输入的时候不会收到这些常用值的补全提示。
而给 string 加上 & {} 后,TypeScript 就不会触发这个自动折叠规则:既可以保留预设字面量的输入提示,方便开发者快速选择常用取值,又允许传入任意自定义字符串,不会把取值范围限制死在几个预设值里。
是合理用法还是类型 Hack?
这个写法最早确实是利用 TypeScript 类型折叠规则的小技巧,但现在已经是 TypeScript 类型生态中被广泛认可的标准实践,包括 @types/react 在内的大量官方维护、高频使用的类型定义包都大量采用这种写法,属于通用的合理用法,不是不规范的野路子 Hack。
内容的提问来源于stack exchange,提问作者Heyyy Marco
相关产品推荐
相关产品推荐

