typescript - 如何“弱化”一个类型的多个属性
问题描述
使用自动生成的类/接口文件(通过 Swagger Codegen 之类的工具)时,通常需要修改这些模型。例如,假设您有一个自动生成的HighSchool
类。
export interface HighSchool {
schoolTypeCode: number;
name: string;
state: string;
city: string;
}
假设我们创建了一个枚举以使使用已知schoolTypeCode
值变得容易。
export const enum HighSchoolTypeCode {
USHighSchool,
GED,
OnlineSchool
}
与其修改自动生成的HighSchool
接口来使用这个枚举,一旦重新执行自动生成就会被覆盖,我可以HighSchool
在一个单独的文件中创建我自己的接口,并schoolTypeCode
通过使用帮助类型“弱化”它来重新键入,如this GitHub issue response中所述.
export interface HighSchool extends Weaken<HighSchool, 'schoolTypeCode'> {
schoolTypeCode?: HighSchoolTypeCode;
}
这是Weaken
助手类型:
type Weaken<T, K extends keyof T> = {
[P in keyof T]?: P extends K ? any : T[P];
};
这里的限制是一次只能削弱一个属性。可以重新设计此帮助器类型以接收一组属性名称吗?虽然这种语法可能不正确,但我想像这样使用它:
interface WeakenedType extends Weaken<OriginalType, ['foo', 'bar']> {
foo?: FooEnum;
bar?: BarEnum;
}
解决方案
如果您将要削弱的属性名称的联合传递给它,它看起来Weaken
会做您想做的事情,如下所示:
interface WeakenedType extends Weaken<OriginalType, 'foo' | 'bar'> {
foo?: FooEnum;
bar?: BarEnum;
}
推荐阅读
- c++ - 是什么导致异常输出以及如何修复它
- oracle - Oracle - 为什么 HAVING 子句可以在 GROUP BY 之前
- c++ - 在编译时创建查找表
- animation - 错误的 UIViewControllerAnimatedTransitioning 动画导致的剩余视图
- android - 调整 RecyclerView 项目的大小和位置
- flutter - 在案例不起作用的情况下颤动多个
- amazon-web-services - 自动化 Cloudformation 模板部署
- android - 无需验证验证码即可登录成功
- c++ - 需要更新 DNS 响应包
- jquery - 获取DataTable中的当前行号