获取T中属性K的值类型
type Obj = { a: string, b: number }
type PickValueTypeExp = PickValueType<Obj, 'a'>
// 相当于
type PickValueTypeExp = string
递归地把T中的属性置为可选
type Obj = { a: { b: { c: string } }, b: number }
type DeepPartialExp = DeepPartial<Obj>
// 相当于
type DeepPartialExp = { a?: { b?: { c?: string } }, b?: number }
允许未知的键
type Obj = { a: string }
type AllowNotExistExp = AllowNotExist<Obj>
const obj: AllowNotExistExp = { a: 'a', b: 0 } // 允许添加b属性
忽略深度 允许未知的键
type Obj = { a: { b: string } }
type DeepAllowNotExistExp = DeepAllowNotExist<Obj>
const obj: DeepAllowNotExistExp = { a: { b: 'b', c: 0 } } // 允许添加c属性
至少包含一个键
type Obj = { a?: string, b?: number }
type AtLeastRequireOneExp = AtLeastRequireOne<Obj, 'a' | 'b'>
const obj: AtLeastRequireOneExp = { a: '' }
const obj2: AtLeastRequireOneExp = { b: 0 }