如何将对象中的某些字段设为必填

Far*_*rad 16 typescript typescript-typings

我需要一个接口来根据需要制作其他接口的某些字段。例如:我有 IUserInterface:

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

interface IUserFromDB {
  id: number;
  name: string;
  role: string;
}
Run Code Online (Sandbox Code Playgroud)

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

我想要这样的东西:

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

type IUserFromDB = WithRequired<IUser, 'role'[|...]> & {
  id: number;
  ...;
};
Run Code Online (Sandbox Code Playgroud)

请帮我创建这个WithRequired类型。

小智 22

您可以创建一个辅助类型并像这样使用它:

// Helper type
export type RequiredFields<T, K extends keyof T> = T & Required<Pick<T, K>>;


// Use
RequiredFields<IUser, 'role'>
Run Code Online (Sandbox Code Playgroud)

对于多个字段,您可以使用联合类型:

RequiredFields<IUser, 'role' | 'someField'>
Run Code Online (Sandbox Code Playgroud)


Ign*_*ago 19

保留您的 IUser 界面

使用PartialPickRequired

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

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

Run Code Online (Sandbox Code Playgroud)

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;
    ...;
};
Run Code Online (Sandbox Code Playgroud)