如何修改TypeScript对象中单个深层嵌套属性的类型
如何递归修改TypeScript深层嵌套属性的类型?
要在保留原类型所有其他属性的前提下,修改深层嵌套的target属性类型,你可以通过递归TypeScript类型工具实现,下面提供两种实用方案:
方案一:全局替换所有同名属性
如果需要把整个类型中所有名为target的属性统一修改为"a" | "b",可以使用这个递归类型:
type DeepReplace<T, Key extends string, NewType> = T extends object ? { [K in keyof T]: K extends Key ? NewType : DeepReplace<T[K], Key, NewType> } : T;
使用示例
// 原类型(包含未展示的其他属性) type Example = { level1: { level2: { level3: { target: string } otherLevel2Prop: number // 该属性会被保留 } otherLevel1Prop: boolean // 该属性会被保留 } } // 生成修改后的类型 type ModifiedExample = DeepReplace<Example, "target", "a" | "b">;
逻辑说明:
- 先判断当前类型是否为对象,若非对象直接返回原类型
- 遍历对象的每个键:如果键名匹配目标
Key,则替换为新类型;否则递归处理该键对应的子类型,确保深层嵌套的属性也能被遍历修改。
方案二:精准替换指定路径的属性
如果只想修改level1.level2.level3.target这一个特定路径的属性,不影响其他同名的target,可以用按路径定位的递归类型:
type SetNestedProperty<T, Path extends string[], NewType> = Path extends [infer First extends keyof T, ...infer Rest extends string[]] ? { [K in keyof T]: K extends First ? SetNestedProperty<T[K], Rest, NewType> : T[K] } : NewType;
使用示例
type ModifiedExampleByPath = SetNestedProperty< Example, ["level1", "level2", "level3", "target"], "a" | "b" >;
逻辑说明:
按照传入的路径数组逐层深入对象结构,最终替换目标位置的属性类型,全程保留所有原有层级的其他属性。
为什么你之前的方法不生效?
你尝试的deepOmit<Example, "target"> & { level1: { level2: { level3: { target: "a" | "b" }}}}会丢失level1下的其他属性,原因是TypeScript交叉类型中,当两个类型存在相同键(此处为level1)时,后面的类型会覆盖前面的,导致level1的原有属性被你手动定义的结构完全替换,而递归类型是在原结构基础上仅修改目标属性,不会破坏原有结构。
内容的提问来源于stack exchange,提问作者myol
相关产品推荐
相关产品推荐

