Есть идеи, как можно рекурсивно применять TypeScript Partial mapped type к интерфейсу, не нарушая при этом никаких ключей с возвращаемыми массивами типами?
Следующие подходы не были достаточными:
interface User {
emailAddress: string;
verification: {
verified: boolean;
verificationCode: string;
}
activeApps: string[];
}
type PartialUser = Partial<User>; // does not affect properties of verification
type PartialUser2 = DeepPartial<User>; // breaks activeApps' array return type;
export type DeepPartial<T> = {
[ P in keyof T ]?: DeepPartial<T[ P ]>;
}
Есть идеи?
ОБНОВЛЕНИЕ: Принятый ответ - лучшее и более общее решение пока.
Найден временный обходной путь, который включает пересечение типов и два сопоставленных типа следующим образом. Наиболее заметным недостатком является то, что вы должны предоставить переопределения свойств для восстановления загрязненных ключей, которые имеют типы возвращаемых массивов.
Например
type PartialDeep<T> = {
[ P in keyof T ]?: PartialDeep<T[ P ]>;
}
type PartialRestoreArrays<K> = {
[ P in keyof K ]?: K[ P ];
}
export type DeepPartial<T, K> = PartialDeep<T> & PartialRestoreArrays<K>;
interface User {
emailAddress: string;
verification: {
verified: boolean;
verificationCode: string;
}
activeApps: string[];
}
export type AddDetailsPartialed = DeepPartial<User, {
activeApps?: string[];
}>