你能制作一个界面的两个版本,一个全是可选字段,一个全是必填字段,同时保持 DRY 吗?

Can you make two versions of an interface, one with all optional and one with all required fields, while staying DRY?

我有一个名为 IPreferences 的界面。它看起来像这样:

export interface IPreferences { 
    genres: Genres[],
    singers: Singer[],
    volume: number
}

因为我允许用户更新他的偏好并且只更新一个或多个字段,所以我创建了一个界面 IPreferenceUpdateRequest 看起来像

export interface IPreferencesUpdateRequest { 
    genres?: Genres[],
    singers?: Singer[],
    volume?: number
}

但这很糟糕,因为我现在有两个几乎相同的界面。

我有没有办法做到这一点,但留下 DRY

是的,打字稿中定义的 Partial<T> 类型允许您以非常干燥的方式做到这一点:

export type IPreferencesUpdateRequest  = Partial<IPreferences>;

是的!使用 Partial<IPreferences>TypeScript standard library is a mapped type 中定义的 Partial<T> 类型将 T 的所有属性映射到可选版本:

export type IPreferencesUpdateRequest = Partial<IPreferences>

希望对您有所帮助;祝你好运!