如何在TypeScript中实现MarkNullable工具类型将指定属性设为可空
解决方案
你只需要把Pick<T, K>部分替换为映射类型,给选中的属性的类型联合null即可,修改后的MarkNullable定义如下:
type MarkNullable<T, K extends keyof T> = Omit<T, K> & { [P in K]: T[P] | null };
原理解释
- 先用
Omit<T, K>从原类型T中排除需要标记为可空的属性,保留其他属性的原有类型 - 再通过映射类型
{ [P in K]: T[P] | null }构造出所有指定属性都附加了null类型的新对象类型 - 两者交叉之后就得到了「指定属性可空、其余属性保持原类型」的目标类型
修改后你的示例代码即可正常工作,Y类型的a属性会被推导为number | null,b属性保持number类型不变,符合预期,完整可运行代码如下:
type MarkNullable<T, K extends keyof T> = Omit<T, K> & { [P in K]: T[P] | null }; type X = { a: number, b: number } type Y = MarkNullable<X, 'a'> const y: Y = {} as any y.a = null // 正常通过类型校验 y.a = 1 // 正常通过类型校验 y.b = 1 // 正常通过类型校验 y.b = null // 会触发类型错误,符合预期
内容的提问来源于stack exchange,提问作者ZiiMakc
相关产品推荐
相关产品推荐

