如何从TypeScript类型中提取可选键并转为必填类型?
实现提取并必填类型中所有可选属性的TypeScript工具类型
问题描述
给定如下TypeScript类型:
type Props = { title: string color?: string timeout?: number | boolean }
需要创建一个通用工具类型RequiredOptional,使得type RProps = RequiredOptional<Props>最终生成:
type RProps = { color: string timeout: number | boolean }
即仅保留原类型的可选属性,并将这些属性全部设为必填。
通用解决方案
可以通过以下方式实现通用的RequiredOptional工具类型:
步骤1:提取类型的可选键
首先实现一个通用的OptionalKeys类型,用于提取任意对象类型中的所有可选属性键:
type OptionalKeys<T> = { [K in keyof T]-?: {} extends Pick<T, K> ? K : never }[keyof T];
这个类型的原理是:通过-?将当前遍历的属性强制设为必填,再判断仅包含该属性的Pick类型是否兼容空对象——如果属性是可选的,Pick<T, K>会允许该属性不存在,因此兼容{},以此筛选出所有可选键。
步骤2:生成必填的可选属性类型
基于OptionalKeys实现RequiredOptional,提取原类型的可选属性并将其设为必填,同时移除类型中的undefined:
type RequiredOptional<T> = { [K in OptionalKeys<T>]: Exclude<T[K], undefined> };
测试验证
将上述工具类型应用到示例的Props类型上:
type Props = { title: string color?: string timeout?: number | boolean } type RProps = RequiredOptional<Props> // 编辑器中会显示: // type RProps = { // color: string; // timeout: number | boolean; // }
解决原方案的问题
- 通用性问题:新实现的
OptionalKeys和RequiredOptional都是通用工具类型,可直接复用在任意对象类型上,无需绑定具体类型。 - 类型显示问题:使用
Exclude<T[K], undefined>直接移除可选属性类型中的undefined,编辑器会直接展示最终的具体类型,而非NonNullable<...>的包装形式,符合预期的显示效果。
内容的提问来源于stack exchange,提问作者FieryRider
相关产品推荐
相关产品推荐

