如何在TypeScript类型中将单个指定属性设为必选而不重复定义?
解决方案
你可以结合TypeScript内置的Pick、Required工具类型和交叉类型实现,不需要重复定义整个类型:
type UserWithName = User & Required<Pick<User, 'name'>>
原理说明
- 先用
Pick<User, 'name'>提取出User类型里的name属性,得到类型{ name?: string } - 再用
Required把提取出的类型转为必选,得到{ name: string } - 最后和原User类型做交叉,可选的name和必选的name交叉后会变成必选,其余属性的可选性和类型完全继承自原User类型,刚好符合你的需求。
通用封装
如果经常需要修改指定属性为必选,可以封装一个通用的泛型工具类型:
// 泛型T是原类型,K是要设为必选的属性名,支持传入联合类型设置多个属性 type SetRequired<T, K extends keyof T> = T & Required<Pick<T, K>> // 使用示例 type UserWithName = SetRequired<User, 'name'> // 同时设置多个属性为必选的示例:把name和email都设为必选 type UserWithNameAndEmail = SetRequired<User, 'name' | 'email'>
内容的提问来源于stack exchange,提问作者Louis Coulet
相关产品推荐
相关产品推荐

