TypeScript的ts-toolbelt源码中映射类型与空对象交叉有何作用?
这种写法的核心作用是强制TypeScript展开映射类型的结构,优化编辑器的类型提示体验,同时不会对原类型的校验逻辑产生任何副作用。
1. 解决映射类型默认不展开的问题
TypeScript对自定义的映射类型工具默认会做「惰性展示」:如果没有和{}交叉,你在编辑器里查看衍生类型的时候,只会看到原始的类型别名,不会直接展示内部的属性结构:
type User = { id: number; name: string } // 无交叉的版本 type ReadonlyFlatOld<O> = { +readonly [K in keyof O]: O[K] } // 编辑器类型提示:type ROld = ReadonlyFlatOld<User> type ROld = ReadonlyFlatOld<User> // 有交叉的版本 type ReadonlyFlat<O> = { +readonly [K in keyof O]: O[K] } & {} // 编辑器类型提示:type R = { readonly id: number; readonly name: string } type R = ReadonlyFlat<User>
对于工具库来说,这种自动展开的提示对使用者非常友好,不用跳转进工具类型的定义就能直接看到最终的属性结构。
2. 无任何类型副作用
{}在TypeScript的类型系统里代表所有非null/undefined的类型,一个对象类型和{}做交叉运算后:
- 所有原有属性、修饰符(readonly、可选)都会完全保留
- 类型兼容性规则和交叉前完全一致,不会影响正常的类型校验
相当于只是给TS的类型展示逻辑加了一个「强制展开」的标记,不会改变工具类型本身的功能。
内容的提问来源于stack exchange,提问作者Alexander Pankin
相关产品推荐
相关产品推荐

