TypeScript如何编写精简的可修改类型指定属性的泛型工具?
精简实现方案
你可以结合TS内置的Omit工具类型+交叉类型来简化逻辑,不需要手动遍历所有属性做条件判断,修改后的MakeNullable写法如下:
type MakeNullable<T extends { nullable: false, value: unknown }> = Omit<T, 'nullable' | 'value'> & { nullable: true value: T['value'] | null }
该实现生成的NullableNumber和你原有实现的结果完全一致,后续如果要新增修改的属性,只需要把属性名加到Omit的第二个参数数组里,同时在后面的交叉对象里定义新的属性类型即可,逻辑非常清晰。
通用可复用方案
如果需要更通用的「修改指定类型部分属性」的工具,可以封装一个通用的Modify泛型,所有类似需求都可以复用它:
// 通用属性修改泛型:将T中与R同名的属性替换为R的定义,其余属性保留 type Modify<T, R extends Partial<Record<keyof T, any>>> = Omit<T, keyof R> & R; // 基于Modify实现你的MakeNullable type MakeNullable<T extends { nullable: false, value: unknown }> = Modify<T, { nullable: true value: T['value'] | null }>
这个Modify泛型兼容所有同场景的属性修改需求,不需要每次都重复写遍历判断逻辑,TS 4.5.2版本完全支持该写法。
内容的提问来源于stack exchange,提问作者tavoyne
相关产品推荐
相关产品推荐

