假设我们有接口(interface)
interface Thing {
uuid: string;
edges: number;
corners: number;
}
并且您想实现一种类型,其中除 uuid 之外的所有属性都保留为可选属性。当将变更集传递给 Thing
时,这种类型会很有用。所有事物都由其 uuid
映射的地方在 HashMap 中。
Partial<Thing>
制作Thing
的所有字段optional whis 不是我们想要的,我们想要uuid
保持强制性。
您将如何以尽可能少的代码重复实现这种类型?
最佳答案
可以使用Partial
和Pick
来达到想要的效果:
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/