You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何从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;
// }

解决原方案的问题

  1. 通用性问题:新实现的OptionalKeys和RequiredOptional都是通用工具类型,可直接复用在任意对象类型上,无需绑定具体类型。
  2. 类型显示问题:使用Exclude<T[K], undefined>直接移除可选属性类型中的undefined,编辑器会直接展示最终的具体类型,而非NonNullable<...>的包装形式,符合预期的显示效果。

内容的提问来源于stack exchange,提问作者FieryRider

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.24 11:17:15