TypeScript如何将导入类型的指定可选属性设置为必填
按需将类型指定属性转为必填的实现方案
TypeScript 没有内置直接对应这个场景的工具类型,但可以通过组合内置工具类型快速实现一个通用的自定义工具类型,按需指定需要转为必填的属性,其余属性保留原有的可选状态。
通用工具类型定义
/** * 把类型T中属于K联合范围内的属性转为必填,其余属性保留原定义 */ type RequiredKeys<T, K extends keyof T> = Omit<T, K> & Required<Pick<T, K>>
使用示例
针对你给出的全可选MyType,如果需要把id、name转为必填,age、description保留可选,直接传入属性名联合即可:
// 原始全可选类型 type MyType = { id?: string name?: string age?: number description?: string } // 处理后得到目标类型 type MyResolvedType = RequiredKeys<MyType, 'id' | 'name'>
最终MyResolvedType的结构完全匹配你的预期:
type MyResolvedType = { id: string // 必填 name: string // 必填 age?: number // 保留可选 description?: string // 保留可选 }
实现原理
逻辑非常直白,拆成两步做类型拼接:
- 用
Pick<T, K>选出需要改为必填的属性,通过内置Required工具类型把这部分属性的可选修饰符去掉 - 用
Omit<T, K>取出不需要修改的剩余属性,完全保留原有的可选/必填状态 - 通过交叉类型
&把两部分类型合并,就得到最终的目标类型
如果使用TS 4.5及以上版本,还可以给泛型K加默认值,让这个工具类型兼容原生Required的用法,不传第二个参数时默认把所有属性转为必填:
type RequiredKeys<T, K extends keyof T = keyof T> = Omit<T, K> & Required<Pick<T, K>>
这个实现没有副作用,就算把原类型里本身就是必填的属性传入K参数,也不会产生错误的类型约束。
内容的提问来源于stack exchange,提问作者theJuls
相关产品推荐
相关产品推荐

