问题 #
实现高级 util 类型 GetRequired<T>
,该类型保留所有必填字段
例如
type case1 = GetRequired<{ foo: number; bar?: string }> // { foo: number }
type case2 = GetRequired<{ foo: undefined; bar?: undefined }> // { foo: undefined }
解答 #
type GetRequired<T> = {
[K in keyof T as T[K] extends Required<T>[K]? K: never]: T[K]
}
拆分 #
- 首先筛选出
K
不为可选参数的属性名 - 拿出所有的属性名
K
和属性值T[K]
- 使用
Require<T>
把T
所有属性转换为必选参数 - 比较
T[K]
和Required<T>
的属性值,如果相同则是需要的属性名,反之则不需要