如何在保留类型可选状态的同时修改TypeScript字段类型?
如何在TypeScript中修改指定字段类型并保留可选状态?
你目前用的TConvertToCustomType工具类型会把目标字段的可选状态弄丢——原因很简单:{[P in K]: TCustomType}这段映射会强制把所有指定字段设为必填,完全忽略原类型里的可选修饰符。
要解决这个问题,直接用全映射类型遍历原类型的所有键,只替换你需要修改的字段类型就行,这样能完整保留原字段的可选性和其他修饰符:
// 先定义你的自定义类型 type TCustomType = /* 填入你的自定义类型定义 */; // 改进后的工具类型 type TConvertToCustomType<T, K extends keyof T> = { [P in keyof T]: P extends K ? TCustomType : T[P]; };
拿你的测试例子验证:
// 原类型 type TSomeType = { a: boolean; b: string; c?: string; // 可选字段 }; // 转换后的类型 type TSomeTypeConverted = TConvertToCustomType<TSomeType, 'b' | 'c'>;
最终得到的TSomeTypeConverted会完美保留字段的可选状态:
{ a: boolean; b: TCustomType; // 保持原有的必填状态 c?: TCustomType; // 保留原有的可选状态 }
为什么这个方法有效?
这个映射类型直接遍历keyof T的所有键:对于属于K的键,替换为TCustomType;其余键完全保留原类型。TypeScript会自动继承原字段的可选修饰符(?),因为我们没有手动添加或移除这个修饰符,只修改了字段的类型本身。
如果需要给不同字段替换不同的自定义类型,还可以扩展成更灵活的版本:
type TConvertFields<T, M extends Record<keyof T, any>> = { [P in keyof T]: P extends keyof M ? M[P] : T[P]; }; // 使用示例:给b替换为TCustomType,给c替换为AnotherCustomType type TSomeTypeConverted = TConvertFields<TSomeType, { b: TCustomType, c: AnotherCustomType }>;
内容的提问来源于stack exchange,提问作者nato nato
相关产品推荐
相关产品推荐

