RequiredByKeys
介绍
实现一个通用的RequiredByKeys<T, K>
,它接收两个类型参数T
和K
。
K
指定应设为必选的T
的属性集。当没有提供K
时,它就和普通的Required<T>
一样使所有的属性成为必选的。
ts
interface User {name?: stringage?: numberaddress?: string}type UserRequiredName = RequiredByKeys<User, 'name'> // { name: string; age?: number; address?: string }
View on GitHubts
interface User {name?: stringage?: numberaddress?: string}type UserRequiredName = RequiredByKeys<User, 'name'> // { name: string; age?: number; address?: string }
起点
ts
/* _____________ Your Code Here _____________ */typeRequiredByKeys <T ,K > = any/* _____________ Test Cases _____________ */interfaceUser {name ?: stringage ?: numberaddress ?: string}interfaceUserRequiredName {name : stringage ?: numberaddress ?: string}interfaceUserRequiredNameAndAge {name : stringage : numberaddress ?: string}typecases = [Type 'false' does not satisfy the constraint 'true'.2344Type 'false' does not satisfy the constraint 'true'.Expect <Equal <RequiredByKeys <User , 'name'>,UserRequiredName >>,Type 'false' does not satisfy the constraint 'true'.2344Type 'false' does not satisfy the constraint 'true'.Expect <Equal <RequiredByKeys <User , 'name' | 'age'>,UserRequiredNameAndAge >>,Type 'false' does not satisfy the constraint 'true'.Expect <Equal <RequiredByKeys <User >,Required <User >>>,
Generic type 'RequiredByKeys' requires 2 type argument(s).2344
2314Type 'false' does not satisfy the constraint 'true'.
Generic type 'RequiredByKeys' requires 2 type argument(s).// @ts-expect-errorExpect <Equal <RequiredByKeys <User , 'name' | 'unknown'>,UserRequiredName >>,]
take the challengets
/* _____________ Your Code Here _____________ */typeRequiredByKeys <T ,K > = any/* _____________ Test Cases _____________ */interfaceUser {name ?: stringage ?: numberaddress ?: string}interfaceUserRequiredName {name : stringage ?: numberaddress ?: string}interfaceUserRequiredNameAndAge {name : stringage : numberaddress ?: string}typecases = [Type 'false' does not satisfy the constraint 'true'.2344Type 'false' does not satisfy the constraint 'true'.Expect <Equal <RequiredByKeys <User , 'name'>,UserRequiredName >>,Type 'false' does not satisfy the constraint 'true'.2344Type 'false' does not satisfy the constraint 'true'.Expect <Equal <RequiredByKeys <User , 'name' | 'age'>,UserRequiredNameAndAge >>,Type 'false' does not satisfy the constraint 'true'.Expect <Equal <RequiredByKeys <User >,Required <User >>>,
Generic type 'RequiredByKeys' requires 2 type argument(s).2344
2314Type 'false' does not satisfy the constraint 'true'.
Generic type 'RequiredByKeys' requires 2 type argument(s).// @ts-expect-errorExpect <Equal <RequiredByKeys <User , 'name' | 'unknown'>,UserRequiredName >>,]
解决方案
Spoiler warning // Click to reveal answer
ts
// most populartypeRequiredByKeys <T ,K extends keyofT = keyofT ,O =Omit <T ,K > & { [P inK ]-?:T [P ] }> = { [P in keyofO ]:O [P ] }
ts
// most populartypeRequiredByKeys <T ,K extends keyofT = keyofT ,O =Omit <T ,K > & { [P inK ]-?:T [P ] }> = { [P in keyofO ]:O [P ] }
ts
// 按照PartialByKeys的思路typeRequiredByKeys <T ,K extends keyofT = keyofT > =Omit < {[P in keyofT asP extendsK ?P : never]-?:T [P ]} &Omit <T ,K >, never>
ts
// 按照PartialByKeys的思路typeRequiredByKeys <T ,K extends keyofT = keyofT > =Omit < {[P in keyofT asP extendsK ?P : never]-?:T [P ]} &Omit <T ,K >, never>