尝试编写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
值)
是否可以选择保留?
答案 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