Разве можно разрушить с помощью аргументов варианта, которые зависят от других? - PullRequest
1 голос
/ 26 февраля 2020

Можно ли использовать деструктуризацию в интерфейсе, где свойство зависит от другого? Мои аргументы следующие:

interface PropsVariationA {
  functionToExecute?: () => void;
  executeExtraFunction: true;
}

interface PropsVariationB {
  executeExtraFunction: false;
}

type Props = PropsVariationA | PropsVariationB;

Поэтому, когда я пытаюсь использовать его с деструктуризацией, я (очевидно) получаю ошибку:

function SomeFunctionWithDestructuring({
  executeExtraFunction,
  functionToExecute = () => {} // Error: property 'functionToExecute' doesnt exist on type 'Props'
}: Props) {
  if (executeExtraFunction) functionToExecute();
  return null;
}

Проверьте это demo .

Мне удалось заставить его работать без разрушения, но мне интересно, есть ли способ.

1 Ответ

0 голосов
/ 26 февраля 2020

Если вы установите для functionToExecute значение undefined в PropsVariationB, то это будет работать:

interface PropsVariationA {
  functionToExecute?: () => void;
  executeExtraFunction: true;
}

interface PropsVariationB {
  functionToExecute: undefined;
  executeExtraFunction: false;
}

type Props = PropsVariationA | PropsVariationB;

// function without destructuring
function SomeFunction(props: Props) {
  if (props.executeExtraFunction && props.functionToExecute)
    props.functionToExecute();
  return "a";
}

// function with destructuring
function SomeFunctionWithDestructuring({
  executeExtraFunction,
  functionToExecute = () => {} // Any way to do destructuing here?
}: Props) {
  if (executeExtraFunction) functionToExecute();
  return null;
}

// This error is right
SomeFunction({ executeExtraFunction: false, functionToExecute: () => {} });
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...