Это работает:
export type OptionalTuNullable<O> = {
[K in keyof O]-?: undefined extends O[K] ? NonNullable<O[K]> | null : O[K];
};
Так, например:
type R = {
a: string;
b?: string;
c?: string | null;
d: string | undefined;
};
type A = OptionalTuNullable<R>;
// A: {
// a: string;
// b: string | null;
// c: string | null;
// d: string | null;
// }
Затем, для части "Pick", вы можете просто прибегнуть к стандартному типу Pick
:
type B = Pick<A, "a" | "c">;
// B: {
// a: string;
// c: string | null;
// }
Подводя итог, я думаю, это подойдет для вашего варианта использования:
type VuexPick<T, K extends keyof T> = Pick<OptionalTuNullable<T>, K>
type C = VuexPick<R, 'c'>
// C: {
// c: string | null;
// }