首页 > 解决方案 > 如何“弱化”一个类型的多个属性

问题描述

使用自动生成的类/接口文件(通过 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;
}

标签: typescript

解决方案


如果您将要削弱的属性名称的联合传递给它,它看起来Weaken会做您想做的事情,如下所示:

interface WeakenedType extends Weaken<OriginalType, 'foo' | 'bar'> {
    foo?: FooEnum;
    bar?: BarEnum;
}

推荐阅读