Решение на данный момент
Сопоставленный тип Undefined, позволяющий передавать набор свойств, соответствующих типу, но без значения:
/**
* Map type to undefined values
*/
type Undefined<T> = {
[P in keyof T]: undefined;
};
Метод removePropToType, который вынуждает меня передать объект с нештатными свойствами SensitiveData
/**
* Given a types T1 and T2, and an object `base` of type `T1 & T2`,
* force you to pass a toRemove value that will lead to a pure T2 type object.
* Warning: Works of first level only.
* @example
* removePropToType<PrivateUser, PublicUser>(privateUser, { sensibleProp: undefined, hiddenProp: undefined })
* @param base The object to cleanup, which should be T1 & T2
* @param toRemove An object containing undefined value, for each properties of T1 that is not in T2
* @returns The base object, but with all property from `toRemove` deleted, therefore a T2 object.
*/
export function removePropToType<T1, T2>(base: T1 & T2, toRemove: Undefined<Omit<T1, keyof T2>>): T2 {
const copy = { ...base };
Object.keys(toRemove).forEach(key => {
delete copy[key as keyof T1];
});
return copy;
}
Затем я могу:
const result: SharableData & SensitiveData = {
... storedSensitive,
calculatedValue: calculateValue(storedSensitive)
}
return removePropToType<SensitiveData, SharableData>(result, { dontShareThis: undefined });
Здесь, если я добавлю или удалю чувствительные свойства в интерфейсе SensitiveData, которых нет в SharableData , компилятор выдаст ошибку.
Я наполовину доволен тем, что мне все еще нужно передать неопределенный объект, но это разумно решило мою проблему.