zhengyimeng/awesome-typescript

实现 RequireAllOrNone ,当设置 age 属性时,gender 属性也会变成必填

Opened this issue · 0 comments

interface Person {
  name: string;
  age?: number;
  gender?: number;
}

type RequireAllOrNone<T, K extends keyof T> =
  | (Omit<T, K> & Required<Pick<T, K>>)
  | { [Key in keyof T]: Key extends K ? never : T[Key] };

const p1: RequireAllOrNone<Person, "age" | "gender"> = {
  name: "lolo",
};

const p2: RequireAllOrNone<Person, "age" | "gender"> = {
  name: "lolo",
  age: 7,
  gender: 1,
};

// Error
const p3: RequireAllOrNone<Person, "age" | "gender"> = {
  name: "lolo",
  age: 7,
};