问题 #
实现高级 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>的属性值,如果相同则是需要的属性名,反之则不需要