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
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。由于它不会影响运行时,我建议无论如何保留它:)
使用通用的完全必需的模型并使用Partial和Pick对于任何派生类型:
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)
| 归档时间: |
|
| 查看次数: |
18206 次 |
| 最近记录: |