У меня есть такой тип TypeScript:

type Api = {
  createItem: (name: string) => Promise<Item>;
  getItem: (id: number) => Promise<Item>;
  updateItem: (item: Item) => Promise<Item>;
  deleteItem: (id: number) => Promise<void>;
};

И я пытаюсь понять, как преобразовать его в следующее:

type Api = {
  createItem: (name: string) => { type: 'success'; result: Item; } | { type: 'error' };
  getItem: (id: number) => { type: 'success'; result: Item; } | { type: 'error' };
  updateItem: (item: Item) => { type: 'success'; result: Item; } | { type: 'error' };
  deleteItem: (id: number) => { type: 'success' } | { type: 'error' };
};

Я думаю, что здесь можно использовать типы карт:

type NewApi = {
  [_ in keyof Api]: (???) => { type: 'success'; result: ??? } | { type: 'error' }
};

Но я не могу понять, как там заполнить пробелы. Я даже не уверен, что это возможно.

Причина, по которой мне нужен этот тип, заключается в том, что я создаю прокси-сервер шлюза, и фактическая реализация типа будет фактическим объектом Proxy, перехватывающим доступ к членам, имитирующим их значения с помощью другого прокси, который перехватывает вызов функции для изменения и возвращает указанный выше тип объединения.

С реализацией все в порядке, но мне кажется, что я не могу получить тип, чтобы заставить Intellisense работать.

2
Tomáš Hübelbauer 18 Окт 2019 в 23:26

1 ответ

Лучший ответ

Вы можете использовать машинописные скрипты Параметры и типы ReturnType

type NewApi = {
  [K in keyof Api]: (...args: Parameters<Api[K]>) => { type: 'success'; result: ReturnType<Api[K]> } | { type: 'error' }
};

Пожалуйста, ознакомьтесь детская площадка .

1
zhuber 18 Окт 2019 в 20:42