组成覆盖(合并)类型操作符

时间:2018-06-06 16:01:49

标签: typescript

尝试编写Overwrite类型的运算符,该运算符应从第一个操作数类型中获取键并用第二个键(也就是对象merge操作)替换它们:

type Overwrite<T, U> = { [P in Exclude<keyof T, keyof U>]: T[P] } & U

type A = {

  a?: number,
  d: boolean
  b: string
}

type B = {  
  b: number
}

type C = Overwrite<A, B> = {
  a: number | undefined; // not optinal anymore
  d: boolean;
} & B

第一个操作数a中的光学键A变为必需(尽管可能undefined值)

是否可以选择保留?

1 个答案:

答案 0 :(得分:2)

尝试使用内置的Pick类型,而不是创建自己的映射类型。类似的东西:

type Overwrite<T, U> = Pick<T, Exclude<keyof T, keyof U>> & U

这将保留T上的任何修饰符,例如readonly或optional,而使用自定义映射类型将删除那些修饰符*

在您的示例中使用该类型时:

declare const test: Overwrite<A, B>;
test.a // (property) a?: number (note: still optional, no undefined union)
test.b // (property) b: number
test.c // (property) d: boolean

Playground Link