Skip to content

RequiredByKeys

题目

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

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

例如:

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

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

解答

参考 PartialByKeys

如果需要属性可选,可以使用 key?: T[key]

如果需要属性必填,可以使用 key-?: T[key]

ts
type MergeType<T> = {
  [P in keyof T]: T[P];
};

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

精选

也可以使用 Omit & Required 内置类型完成:

ts
type RequiredByKeys<T, K extends keyof T = keyof T> = Omit<
  T & Required<Pick<T, K & keyof T>>,
  never
>;

Released under the MIT License.