Странно, что omit
не определяет типы самостоятельно. Я не уверен, есть ли для этого причина, но мне удалось придумать вспомогательную функцию, которая должна помочь.
function omitWithTypes<A extends ReadonlyArray<keyof B>, B extends Object>(
typeArray: A,
obj: B
) {
return omit(typeArray)(obj) as Omit<B, A[number]>;
}
Тип утилиты Omit позволит Вы узнаете свойства вида. Однако, если вы хотите преобразовать значения массива в тип объединения и перейти к Omit
, массив должен быть доступен только для чтения, что вы можете удовлетворить с помощью as const
assertion чтобы сообщить компилятору TS, что он не будет изменяться.
const filter = ["serializedSvg", "svgSourceId"] as const;
const exclusive = omitWithTypes(filter, props);
OR
const exclusive = omitWithTypes(["serializedSvg", "svgSourceId"] as const, props);
Вы получите правильные предполагаемые типы (хотя это немного многословно, так как оно использует Pick
скрытый тип утилиты):
Вы даже получите сообщение об ошибке, если попытаетесь исключить значения, не являющиеся свойствами объекта. выбирается из: