typescript - 一个 Partial<T>,它按照 TypeScript 的要求保留 T 的一个字段

标签 typescript

假设我们有接口(interface)

interface Thing {
  uuid: string;
  edges: number;
  corners: number;
}

并且您想实现一种类型,其中除 uuid 之外的所有属性都保留为可选属性。当将变更集传递给 Thing 时,这种类型会很有用。所有事物都由其 uuid 映射的地方在 HashMap 中。

Partial<Thing>制作Thing的所有字段optional whis 不是我们想要的,我们想要uuid保持强制性。

您将如何以尽可能少的代码重复实现这种类型?

最佳答案

可以使用PartialPick来达到想要的效果:

type PartialRequired<T, TRequired extends keyof T> = Partial<T> & Pick<T, TRequired>

type PartialThing = PartialRequired<Thing, 'uuid'>

let pp: PartialThing = {
    uuid: ""
}

上面的版本有点不方便,uuid 的类型是string | (undefined & string) 按预期工作但看起来很糟糕,我们可以使用 Omit 类型来获得更友好的类型:

type Diff<T extends string, U extends string> = ({[P in T]: P } & {[P in U]: never } & { [x: string]: never })[T];  
type Omit<T, K extends keyof T> = Pick<T, Diff<keyof T, K>>; 
type PartialRequired<T, TRequired extends keyof T> = Partial<Omit<T, TRequired>> & Pick<T, TRequired>

用法相同。

对于任何一个版本,您都可以指定更多必填字段:

type PartialThingWithEdges = PartialRequired<Thing, 'uuid' | 'edges'>

关于typescript - 一个 Partial<T>,它按照 TypeScript 的要求保留 T 的一个字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49008869/

相关文章:

angular - 如何只在 Ngx-datatable 表中选中 1 个复选框?

javascript - 将路由组件的选择器留在原地有什么缺点吗?

javascript - 如何检查 url.createobjecturl 生成的 uri 在 typescript 中是否仍然有效

typescript :如何输入不同类型的未知大小的元组?

javascript - 从Reducer调用选择器

typescript - 如何限制 setter 仅对特定类可用?

angular - Ionic 3 - 无法点击谷歌地图上方显示的警报对话框

reactjs - 输入 { child : Element; } has no properties in common with type IntrinsicAttributes

Angular 2 : Sum two Observable<number> values

javascript - Angular 2 管道依赖注入(inject)