Могу ли я использовать loda sh без возврата определенного типа c вместо частичного типа? - PullRequest
1 голос
/ 28 мая 2020

В приведенном ниже коде

import omit from "lodash/fp/omit";

type EnhancerProps = {
  serializedSvg: string;
  svgSourceId: string;
  containerId: string;
};

const rest = omit(["serializedSvg", "containerId"])(props);

остальное указано как Частичное. Что я могу сделать, чтобы не возвращать что-то более конкретное c, например {svgSourceId: string}.

1 Ответ

2 голосов
/ 29 мая 2020

Странно, что 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 скрытый тип утилиты):

enter image description here

Вы даже получите сообщение об ошибке, если попытаетесь исключить значения, не являющиеся свойствами объекта. выбирается из:

enter image description here

...