如何在对象中制作一些字段

时间:2019-08-16 17:18:51

标签: typescript typescript-typings

我需要一个接口,用于根据需要创建其他接口的某些字段。 例如:我有IUserInterface:

interface IUser {
  name: string;
  role?: string;
}

interface IUserFromDB {
  id: number;
  name: string;
  role: string;
}

当我创建新用户时-角色是可选的。数据库设置了默认角色,当我从数据库中选择用户时-role必须位于userObject中。 我可以像上面写的那样编写接口,但是在实际项目中,这种方法会创建很多冗余代码。因此,我需要一些接口,帮助我获得旧的接口并根据需要创建一些可选字段。

我想要这样的东西:

interface IUser {
  name: string;
  role?: string;
}

type IUserFromDB = WithRequired<IUser, 'role'[|...]> & {
  id: number;
  ...;
};

请帮助我创建此WithRequired类型。

1 个答案:

答案 0 :(得分:2)

保持您的IUser界面

使用PartialPickRequired

interface IUser {
    name: string;
    role?: string;
}

type IUserFromDB = Partial<IUser> & Required<Pick<IUser, 'name' | 'role'>> & {
    id: number;
    ...;
};

在这种情况下,除非增长Partial,否则不需要使用IUser。由于它不会影响运行时,因此我还是建议保留它:)

替代方法

使用通用的完全必需模型,并对任何派生类型使用PartialPick

interface IUserModel {
    name: string;
    role: string;
}

type IUser = Partial<IUserModel> & Pick<IUserModel, 'name'>; 

type IUserFromDB = Partial<IUserModel> & Pick<IUserModel, 'name' | 'role'> & {
    id: number;
    ...;
};