Pick all from B
, remove A
index signature:
type C = Pick<B, KnownKeys<B>>;
Pick all from B
, exclude all from A
, remove A
index signature:
type D = Omit<C, KnownKeys<A>>
Type KnownKeys<T>
removes the index signature of T
, using only the known property keys (credit goes to Mihail Malostanidis and his answers here and here):
type KnownKeys<T> = {
[K in keyof T]: string extends K ? never : number extends K ? never : K
} extends { [_ in keyof T]: infer U } ? U : never;
How do types C
and D
look like?
type C = {
banana?: number | undefined;
apple?: number | undefined;
}
type D = {
banana?: number | undefined;
}
const c: C = {
apple: 1,
banana: 2,
}
const d: D = {
banana: 2
}
Playground