javascript - TypeScript - 结合两个接口(interface)并使其某些成员成为强制性的

标签 javascript reactjs typescript

我有以下两个接口(interface)不能修改:

interface User {
  username: string;
  email?: string;
  age?: number;
  country?: string;
}

interface Player {
  room: number;
  group?: string;
  device?: string;
}

我想将它们组合成一个界面:Member,同时制作字段:User['email']Player[' group'] 强制性的(只有那 2 个)。

我尝试了以下方法(作为起点(待定)):

// please edit this code accordingly
interface Member extends User, Player  {}

然后,预期的结果是得到一个错误:

const member: Member = {
  username: 'bill.gates',
  // email: 'bill.gates@microsoft.com',
  age: 50,
  room: 5,
  // group: 'A',
}

因为未指定 emailgroup

这里有一个 Playground .

谢谢!

最佳答案

您可以使用 Utility Types 中的 PickRequiredOmit 的组合来实现这一点.

type Member = Required<Pick<User & Player, 'email' | 'group'>> & Omit<User & Player, 'email' | 'group'>;


/*
Type '{ username: string; age: number; room: number; }' is not assignable to type 'Member'.
  Type '{ username: string; age: number; room: number; }' is missing the following properties from type 'Required<Pick<User & Player, "email" | "group">>': email, group(2322)
*/
const member: Member = {
  username: 'bill.gates',
  // email: 'bill.gates@microsoft.com',
  age: 50,
  room: 5,
  // group: 'A',
}

这是一个working playground

关于javascript - TypeScript - 结合两个接口(interface)并使其某些成员成为强制性的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59134914/

相关文章:

javascript - SlideToogle 无法与动态生成的元素一起正常工作

javascript - JS OffscreenCanvas.toDataURL

angular - 如何在 Angular 7 中获取外部 URL 的参数

javascript - 如何将 ngStyle 传递给在 Angular 中定义为元素的指令?

javascript - setTimeout 在 "for loop"内无法正常工作

javascript - React Link 标签阻止 flex-boxes 工作

javascript - 在 Swiper JS 中放大鼠标悬停

reactjs - Redux 如何在嵌套属性上使用 createEntityAdapter?

angular - 如何从 Angular Material 日期选择器中排除日期?

javascript - Angular 2 根据数字长度在数字之间放置空格