Skip to content

requiredByKeys

约 340 字大约 1 分钟

2024-12-18

题目

Github: requiredByKeys

实现一个通用的RequiredByKeys<T, K>,它接收两个类型参数TK

K指定应设为必选的T的属性集。当没有提供K时,它就和普通的Required<T>一样使所有的属性成为必选的。

interface User {
  name?: string
  age?: number
  address?: string
}

type UserRequiredName = RequiredByKeys<User, 'name'>
// { name: string; age?: number; address?: string }

解题思路

略。

答案

type RequiredByKeys<T, K extends keyof T = keyof T> = Omit<{
  [P in keyof T as P extends K ? P : never]-?: T[P]
} & {
  [P in keyof T as P extends K ? never : P]: T[P]
}, never>

验证

interface User {
  
name
?: string
age
?: number
address
?: string
} interface UserRequiredName {
name
: string
age
?: number
address
?: string
} interface UserRequiredNameAndAge {
name
: string
age
: number
address
?: string
} type
cases
= [
Expect
<
Equal
<
RequiredByKeys
<User, 'name'>, UserRequiredName>>,
Expect
<
Equal
<
RequiredByKeys
<User, 'name' | 'age'>, UserRequiredNameAndAge>>,
Expect
<
Equal
<
RequiredByKeys
<User>,
Required
<User>>>,
// @ts-expect-error
Expect
<
Equal
<
RequiredByKeys
<User, 'name' | 'unknown'>, UserRequiredName>>,
]

参考