实现 GetOptionals
获取一个类型中的所有可选类型:
ts
interface ComplexObject {
name: string;
option1?: number;
option2?: boolean;
}
const keys: GetOptional<ComplexObject>;
// 结果 { option1?: number; option2?: boolean; }
ts
type GetOptionals<T> = {
[K in keyof T extends Required<T>[K] ? never : K]: T[K];
};
组件解析
Required<T>
: 是 TypeScript 的内置工具类型,它将类型 T 的所有属性转换为必需的,即去除所有属性的可选性。映射类型
[K in keyof T]
:
[K in keyof T]
是一个映射类型,它会遍历类型 T 的每个键。
- 条件类型
T[K] extends Required<T>[K] ? never : K
:
T[K] extends Required<T>[K]
检查原始类型 T 中的属性 K 是否与在 Required<T>
中的对应属性类型相同。如果相同,说明属性 K 在原始类型 T 中是必需的;如果不同,说明属性 K 在原始类型 T 中是可选的。 使用条件类型的 as 子句 as T[K] extends Required<T>[K] ? never : K
,如果属性是必需的,则映射到 never(即不包括该属性),如果属性是可选的,则保留该属性名。
- 属性类型
T[K]
:
对于每个保留下来的键(即可选属性的键),将其类型设置为 T[K]
,即原始类型 T 中该属性的类型。