TypeScript两种Mapped Types写法是否存在差异?
两种TypeScript映射类型是否存在差异?
这两个映射类型在所有合法场景下都没有区别,核心原因是TypeScript的交叉类型不区分顺序:string & P 和 P & string 的运算结果完全等价。
具体分析
TypeScript中,交叉类型 A & B 和 B & A 是完全一致的,交换类型顺序不会改变最终的交叉结果。这里的P是keyof T的成员,而keyof T的类型只能是string | number | symbol:
- 当
P是字符串类型时,string & P和P & string都等于P本身,Capitalize可以正常将键名首字母大写; - 当
P是数字或符号类型时,string & P和P & string都会得到never类型,映射类型会自动忽略never类型的键,不会生成对应的属性。
验证示例
以你提供的Person接口为例:
interface Person { name: string; age: number; }
两种映射类型都会生成完全相同的结果:
type UppercasePerson = { Name: string; Age: number; }
特殊场景测试
哪怕T包含数字或符号类型的键,比如:
type MixedType = { name: string; 0: number; [Symbol('id')]: boolean; }
使用两种映射类型处理后,都会只保留首字母大写的字符串键:
type UppercaseMixed = { Name: string; }
数字键0和符号键都会被过滤,两种写法的结果完全一致。
内容的提问来源于stack exchange,提问作者Serg
相关产品推荐
相关产品推荐

