Условный тип функции - PullRequest
2 голосов
/ 24 апреля 2020

Учитывая следующий сценарий,

function doSomething({ id, name, onSelect, onUnselect }: TDoSomething) {
  if (onSelect) {
    // I want `onUnselect` to be defined here
    // ...
  }

  return { id, name }
} 

type TDoSomething =
  | IDoSomethingWithoutSelect
  | IDoSomethingWithSelect

interface IDoSomethingWithoutSelect {
  id: string
  name: string
}

interface IDoSomethingWithSelect {
  id: string
  name: string

  onSelect: (id: string) => void
  onUnselect: (id: string) => void
}

То, что я хочу сделать, (концептуально?) Просто: хочу, чтобы onUnselect было обязательно определено, если onSelect. Другими словами, если я передам onSelect, то эта функция также должна ожидать onUnselect.

(игровая площадка к вам доступна здесь.)

Оказывается, мои попытки были неудачными. Я не знаю точно, что мне следует делать, чтобы добиться успеха.

(это еще кое-что, что я пытался сделать)

1 Ответ

2 голосов
/ 24 апреля 2020

Вы можете использовать оператор in для сужения типа аргумента до IDoSomethingWithSelect

function doSomething(arg: TDoSomething) {
  const { id, name } = arg;
  if ('onSelect' in arg) {
    arg.onUnselect(id);
  }

  return { id, name }
} 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...