【问题标题】:How to make some fields in object required如何使对象中的某些字段成为必需的
【发布时间】:2022-05-01 17:12:07
【问题描述】:

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

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

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

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

我想要这样的东西:

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

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

请帮我创建这个WithRequired 类型。

【问题讨论】:

标签: typescript typescript-typings


【解决方案1】:

保留您的 IUser 界面

使用PartialPickRequired

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

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

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

替代方法

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

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

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

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

【讨论】:

    【解决方案2】:

    你可以创建一个辅助类型并且使用是这样的:

    // Helper type
    export type RequiredField<T, K extends keyof T> = T & Required<Pick<T, K>>;
    
    
    // Use
    RequiredField<IUser, 'role'>
    

    【讨论】:

      猜你喜欢
      • 2015-05-21
      • 1970-01-01
      • 1970-01-01
      • 2020-09-03
      • 1970-01-01
      • 2018-03-14
      • 1970-01-01
      • 2018-09-12
      • 1970-01-01
      相关资源
      最近更新 更多